我搜索了谷歌关于我的问题,无法找到任何可以解决我的问题的答案。 我试图从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>
这是我的viewmodel,它包含Command函数:
public ICommand DeliverOrderCommand
{
get
{
if (deliverOrderCommand == null)
deliverOrderCommand = new DelegateCommand(DeliverOrderFunc);
return deliverOrderCommand;
}
set { deliverOrderCommand = value; }
}
当我尝试调试时,它不会进入ICommand。 那么如何将数据网格中的按钮绑定到我的viewmodel?
答案 0 :(得分: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>
另一种(略微hacky)方法是声明一个辅助类,它为DataGridColumn类创建一个附加属性,然后在网格的datacontext发生更改时填充该属性(它通过处理在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);
}
}
}
您可以找到有关此方法的更多详细信息here。