在我的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");
}
视图和viewmodel之间的连接有效。我有一些其他属性绑定工作正常。
为什么不调用SelectCategory-Method?
答案 0 :(得分:2)
如果使用此代码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>
答案 1 :(得分:0)
WPF DataGrid是一种ItemsControl
。现在,使用ItemsControl
,在视图中生成的每个单独控件(单个项目的控件)都将DataContext
设置为集合中的该项。例如:
<DataGrid ItemsSource="{Binding Foos}" />
public ObservableCollection<Foo> Foos { ... }
在这种情况下,DataGridRow
的DataContext将设置为Foo
的实例。我的猜测是你的命令与集合所在的ViewModel相同,而不是单个项目的级别。您必须使用RelativeSource
引用回DataGrid
本身,以便您可以访问该级别的DataContext
,或者您的收藏中的项目需要是他们的ViewModels拥有包含其级别命令的。