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