2013-10-29 53 views
0

在我的XAML代码我有以下DataGridTemplateColumn的CommandBinding在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> 

的SelectCategoryCommand - 属性,视图模型是:

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

而在视图模型我的构造函数:

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

而SelectCategory-Method是强制t

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

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

为什么不调用SelectCategory方法?

回答

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> 
0

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

<DataGrid ItemsSource="{Binding Foos}" /> 

public ObservableCollection<Foo> Foos { ... } 

在这种情况下,DataGridRow的DataContext的将被设置为一个Foo的一个实例。我的猜测是你的命令与集合所在的ViewModel相同,而不是单个项目的级别。您必须使用RelativeSource才能参考DataGrid本身,因此您可以在该级别访问DataContext,否则集合中的项目需要是其自己的包含该级别命令的ViewModels。

相关问题