【问题标题】:Commandbinding in DataGridTemplateColumn not workingDataGridTemplateColumn 中的命令绑定不起作用
【发布时间】:2013-10-29 20:13:49
【问题描述】:

在我的 xaml 代码中,我有以下 DataGridTemplateColumn

<DataGridTemplateColumn Header="Category">
    <DataGridTemplateColumn.CellTemplate>
       <DataTemplate>
          <Button x:Name="categoryButton" Style="{StaticResource Flat}"
                  Tag="{Binding Category}"
                  Command="{Binding SelectCategoryCommand,
                                    UpdateSourceTrigger=PropertyChanged}"
                  CommandParameter="{Binding ElementName=categoryButton,
                                               Path=Tag}">
              <Image Source="{Binding Category, Converter={StaticResource 
                                                        categoryConverter}}"/>
          </Button>
       </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
 </DataGridTemplateColumn>

ViewModel 中的 SelectCategoryCommand-Property 是:

        private ICommand selectCategoryCommand;
        public ICommand SelectCategoryCommand
        {
            get { return this.selectCategoryCommand; }
            set
            {
                this.selectCategoryCommand = value;
                OnPropertyChanged("SelectCategoryCommand");
            }
        }

在 ViewModel 的构造函数中我有:

...
this.SelectCategoryCommand = new RelayCommand(SelectCategory);
...

而 SelectCategory-Method 只是

private void SelectCategory(object parameter)
{
   MessageBox.Show("dummy");
}

视图和视图模型之间的连接有效。我还有一些其他属性,绑定可以正常工作。

为什么 SelectCategory-Method 没有被调用?

【问题讨论】:

    标签: c# wpf binding datagrid


    【解决方案1】:

    如果您使用此代码Command="{Binding SelectCategoryCommand,命令将在 DataContext 行中搜索(在模型类中)。因此,如果您的命令在主视图模型中,您应该使用RelativeSource 绑定。

    <DataGridTemplateColumn Header="Category">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <Button x:Name="categoryButton" Style="{StaticResource Flat}" Tag="{Binding Category}"
                            Command="{Binding Path=DataContext.SelectCategoryCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, UpdateSourceTrigger=PropertyChanged}"
                            CommandParameter="{Binding ElementName=categoryButton, Path=Tag}">
                    <Image Source="{Binding Category, Converter={StaticResource categoryConverter}}"/>
                </Button>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    

    【讨论】:

      【解决方案2】:

      WPF DataGrid 是ItemsControl 的一种类型。现在,使用ItemsControl,在视图中生成的每个单独的控件(用于单个项目的控件)都将其DataContext 设置为集合中的该项目。例如:

      <DataGrid ItemsSource="{Binding Foos}" />
      
      public ObservableCollection<Foo> Foos { ... }
      

      在这种情况下,DataGridRow 的 DataContext 将设置为 Foo 的实例。我的猜测是您的命令位于集合所在的同一 ViewModel 中,而不是在单个项目的级别。您要么必须使用RelativeSource 来引用DataGrid 本身,以便您可以在该级别访问DataContext,或者您的集合中的项目需要是它们自己的ViewModel,其中包含以下命令他们的水平。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-08
        • 2014-11-15
        • 2011-09-28
        • 2011-11-27
        • 2013-02-19
        • 1970-01-01
        • 1970-01-01
        • 2013-10-03
        相关资源
        最近更新 更多