在Prism WPF中绑定DataGrid与命令

4

我在谷歌上搜寻了关于我的问题,但是找不到任何能解决我的问题的答案。我尝试在WPF中从一个数据网格内的按钮绑定命令。我使用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>

这是我的视图模型,其中包含命令函数:

public ICommand DeliverOrderCommand
    {
        get 
        {
            if (deliverOrderCommand == null)
                deliverOrderCommand = new DelegateCommand(DeliverOrderFunc);
            return deliverOrderCommand; 
        }
        set { deliverOrderCommand = value; }
    }

当我尝试进行调试时,它没有进入ICommand。那么我该如何将我的数据网格中的按钮绑定到我的视图模型?

1个回答

5

你的问题是由于DataColumns不是可视树的一部分,因此不会继承DataGrid的DataContext。

一个潜在的解决方法是使用绑定指定一个祖先元素:

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

另一种(有点hacky的)方法是声明一个帮助类,为DataGridColumn类创建一个附加属性,并在网格的数据上下文更改时填充该属性(它通过处理FrameworkElement级别的事件变化并检查负责该事件的依赖对象是否为DataGrid来实现):
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);
        }
    }
}

你可以在这里找到更多关于这种方法的详情


1
谢谢@slugster,我的问题用第一种方法解决了。 :D - ganiamri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接