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

Mef*_*to1 3 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>
Run Code Online (Sandbox Code Playgroud)

读完这个问题并回答:

如何使用RelativeSource Binding创建DataGrid绑定到Model和ViewModel?

我补充说

RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}
Run Code Online (Sandbox Code Playgroud)

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

 DeleteCustomerCommand = new RelayCommand<Customer>(DeleteCustomer);
Run Code Online (Sandbox Code Playgroud)

和命令是私有setter的公共属性:

public RelayCommand<Customer> DeleteCustomerCommand { get; private set; }
Run Code Online (Sandbox Code Playgroud)

我只收到以下错误:

在'object'''DataGrid'(Name ='')'上找不到DeleteCustomerCommand'属性.BindingExpression:路径= DeleteCustomerCommand; DataItem ='DataGrid'(Name =''); target元素是'Button'(Name =''); target属性是'Command'(类型'ICommand')

Mar*_*tin 7

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

Command="{Binding DataContext.DeleteCustomerCommand, RelativeSource=...
Run Code Online (Sandbox Code Playgroud)

因为DeleteCustomerCommandDataGrid的视图模型中没有属性但与之相关联DataGrid.


附加信息

有时它可以帮助我为DataContextVisual Studio助手创建一个绑定,而不是完全手动编码.只需在控件的属性网格中查找要为其创建绑定的属性.

在这种情况下它的Command财产.左键单击命令属性文本的文本框,然后从上下文菜单中选择"创建数据绑定...".