2012-11-12 142 views
4

我搜索了谷歌有关我的问题,并找不到任何答案可以解决我的问题。 我试图绑定WPF中我的datagrid中的按钮的命令。我使用Prism来处理MVVM。 这里是我的代码绑定命令:Datagrid与棱镜绑定命令WPF

<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的。 那么如何将datagrid中的按钮绑定到我的viewmodel?

回答

3

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

一个潜在克服这种方式与你绑定指定一个祖先:

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

另一个(略哈克)的方式是声明DataGridColumn类的,然后填充创建一个附加属性的辅助类该属性时的网格变化(由它处理事件在FrameworkElement的层次变化,检查是否对事件负责的依赖对象是一个DataGrid做到这一点)在DataContext:

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); 
     } 
    } 
} 

你可以找到铁道部有关此方法的详细信息here

+1

谢谢@slugster我的问题使用第一种方法解决。 :d – ganiamri