DataGridTemplateColumn中的命令绑定无法正常工作

时间:2013-10-29 20:13:50

标签: c# wpf binding datagrid

在我的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?

2 个答案:

答案 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拥有包含其级别命令的。