2013-10-29 86 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。

相關問題