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");
}
视图和视图模型之间的连接有效。我还有其他一些绑定工作正常的属性。
为什么不调用选择类别方法?
如果你在 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,其中包含其级别的命令。