DataGridTemplateColumn 中的命令绑定不起作用

本文关键字:绑定 不起作用 命令 DataGridTemplateColumn | 更新日期: 2023-09-27 18:37:25

在我的 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-属性为:

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

在视图模型的构造函数中,我有:

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

选择类别方法只是

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

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

为什么不调用选择类别方法?

DataGridTemplateColumn 中的命令绑定不起作用

如果你在 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>

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

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

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