使用Prism WPF在Datagrid中绑定命令

使用Prism WPF在Datagrid中绑定命令,wpf,mvvm,datagrid,command,prism,Wpf,Mvvm,Datagrid,Command,Prism,我在谷歌搜索过我的问题,但找不到任何能解决我问题的答案。 我试图从WPF中的datagrid内的按钮绑定命令。我使用Prism来处理MVVM。 以下是绑定命令的代码: <DataGrid AutoGenerateColumns="False" ... SelectedItem="{Binding OrderDetail}" ItemsSource="{Binding ListOrderDetail}"&g

我在谷歌搜索过我的问题,但找不到任何能解决我问题的答案。 我试图从WPF中的datagrid内的按钮绑定命令。我使用Prism来处理MVVM。 以下是绑定命令的代码:

<DataGrid AutoGenerateColumns="False" 
              ...
              SelectedItem="{Binding OrderDetail}"
              ItemsSource="{Binding ListOrderDetail}">
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="Deliver Order" 
                                Command="{Binding Path=DataContext.DeliverOrderCommand}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
当我尝试调试时,它没有进入ICommand。
那么,如何将datagrid中的按钮绑定到viewmodel?

您的问题是,DataColumns不是可视化树的一部分,因此不会继承datagrid的DataContext

可能克服这一问题的一种方法是使用绑定指定祖先:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Button Content="Deliver Order" 
                Command="{Binding  Path=DataContext.DeliverPesananCommand
                                  ,RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" 
                />
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

您可以找到有关此方法的更多详细信息。

谢谢@slugster使用第一种方法解决了我的问题:D
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Button Content="Deliver Order" 
                Command="{Binding  Path=DataContext.DeliverPesananCommand
                                  ,RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" 
                />
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
public class DataGridContextHelper
{

    static DataGridContextHelper()
    {
        DependencyProperty dp = FrameworkElement.DataContextProperty.AddOwner(typeof(DataGridColumn));
        FrameworkElement.DataContextProperty.OverrideMetadata( typeof(DataGrid)
                                                              ,new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits, OnDataContextChanged)
                                                             );
    }

    public static void OnDataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var grid = d as DataGrid;
        if (grid == null) return;

        foreach (var col in grid.Columns)
        {
            col.SetValue(FrameworkElement.DataContextProperty, e.NewValue);
        }
    }
}