0

在我的 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");
}

视图和视图模型之间的连接有效。我还有一些其他属性,绑定可以正常工作。

为什么不调用 SelectCategory-Method?

4

2 回答 2

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>
于 2013-10-29T20:21:39.370 回答
0

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

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

public ObservableCollection<Foo> Foos { ... }

在这种情况下,DataGridRow的 DataContext 将设置为 的实例Foo。我的猜测是您的命令位于集合所在的同一 ViewModel 中,而不是在单个项目的级别。您要么必须使用RelativeSource引用回DataGrid自身,以便您可以访问该DataContext级别的 ,否则您的集合中的项目将需要是它们自己的 ViewModel ,其中包含其级别的命令。

于 2013-10-29T20:28:21.033 回答