DataGrid按钮,命令绑定相对源,树不起作用

时间:2015-10-16 14:03:18

标签: c# wpf xaml datagrid

我有一个包含少量文本列和删除按钮的数据网格:

<DataGrid ItemsSource="{Binding Customers, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False" CanUserAddRows="False" SelectedItem="{Binding SelectedCustomer}"> 
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding FirstName}">
                    <DataGridTextColumn.Header>
                        <Label Content="{DynamicResource FirstName}" />
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Binding="{Binding LastName}">
                    <DataGridTextColumn.Header>
                        <Label Content="{DynamicResource LastName}" />
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Binding="{Binding Address}">
                    <DataGridTextColumn.Header>
                        <Label Content="{DynamicResource Address}" />
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>

                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Content="{DynamicResource Delete}" Command="{Binding DeleteCustomerCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" CommandParameter="{Binding SelectedCustomer, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
</DataGrid>

阅读了这个问题并回答:

How to use RelativeSource Binding to create DataGrid binding to Model and ViewModel?

我添加了

RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}

一部分。但是,没有任何作用。当我使用Snoop进行调试时,我可以看到DataContexts已正确设置。 DataGrid的datacontext是ViewModel,它使用Customers集合属性,网格行的数据上下文是预期的单个Customer对象。 我已经检查过命令是用真实姓名引用的,并且它们是公开的。命令在ViewModel的构造函数中初始化:

 DeleteCustomerCommand = new RelayCommand<Customer>(DeleteCustomer);

并且命令是具有私有设置器的公共属性:

public RelayCommand<Customer> DeleteCustomerCommand { get; private set; }

我只收到以下错误:

  

DeleteCustomerCommand&#39;在&#39; object&#39;上找不到的属性&#39;&#39;数据网格&#39;   (名称=&#39;&#39;)&#39 ;. BindingExpression:路径= DeleteCustomerCommand;   的DataItem =&#39;数据网格&#39; (名称=&#39;&#39);目标元素是&#39;按钮&#39; (名称=&#39;&#39);   目标财产是&#39; Command&#39; (键入&#39; ICommand&#39;)

1 个答案:

答案 0 :(得分:5)

尝试将“DataContext”添加到命令绑定中:

dog = 9

因为dog = 9上没有Command="{Binding DataContext.DeleteCustomerCommand, RelativeSource=... 属性,但在与DeleteCustomerCommand相关联的视图模型中没有。{/ p>


其他信息

有时它帮助我使用Visual Studio助手为DataGrid创建绑定,而不是手动完成编码。 只需在控件的属性网格中查找要为其创建绑定的属性。

在这种情况下,它是DataGrid属性。左键单击命令属性文本的文本框,然后从上下文菜单中选择“创建数据绑定...”。