我正在使用MVVM-light-Toolkit中的EventToCommand类来处理WPF-DataGrid中的AutoGeneratingColumn-Event。它在我的Main-DataGrid中工作正常,但我在RowDetailsTemplate中使用另一个DataGrid,这里我遇到了一个问题: AutoGeneratingColumn在生成EventToCommand-Object之前触发。有这个问题的解决方案吗? 这是我的Xaml代码:
<DataGrid DockPanel.Dock="Top" AutoGenerateColumns="True" Name="table" VerticalAlignment="Top" ItemsSource="{Binding PartBatchList}" IsReadOnly="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="AutoGeneratingColumn">
<hgc:EventToCommand Command="{Binding AutoGeneratingColumnCommand}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<StackPanel Margin="30,0,30,30" Orientation="Vertical">
<Border CornerRadius="4" Padding="5" Background="White">
<DataGrid ItemsSource="{Binding Workpieces}"
CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False"
AutoGenerateColumns="True" AutoGeneratingColumn="WorkpieceListAutoGeneratingColumn">
<i:Interaction.Triggers>
<i:EventTrigger EventName="AutoGeneratingColumn">
<hgc:EventToCommand Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid},AncestorLevel=2}, Path=DataContext.AutoGeneratingColumnCommand}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</DataGrid>
</Border>
</StackPanel>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
调用Code-Behind文件中的Event-Handler WorkpieceListAutoGeneratingColumn,从不调用ViewModel中的Command。
安德烈亚斯
答案 0 :(得分:2)
原因应该是您不能在同一个对象/事件组合上命令事件管理器和事件。从DataGrid中删除AutoGeneratingColumn="WorkpieceListAutoGeneratingColumn"
,应该调用该命令。 击>
我自己遇到问题: - )
修改强>
如果您需要后面代码中的eventhandler,请删除EventToCommand
并在后面的代码中调用命令,例如
public void WorkpieceListAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs args) {
var vm = ((YourViewModel) this.DataContext);
if (vm.AutoGeneratingColumnCommand.CanExecute(eventArgs))
vm.AutoGeneratingColumnCommand.Execute(eventArgs);
}
但是,我认为第一个选择是更好的选择。
修改2
好的,看了一下,似乎<i:Interaction.Triggers/>
仅在对象已经呈现并且发生用户交互(因此名称?)之后才起作用。嗯,这意味着只有一些事件 - 在构造对象期间调用的事件 - 不能由EventToCommand
机制处理。在这些情况下,可以使用后面的代码从那里调用命令,请参阅我的第一次编辑。
答案 1 :(得分:1)
您不必使用背后的恶意代码;-)您可以使用附加行为来执行此操作...
public class AutoGeneratingColumnEventToCommandBehaviour
{
public static readonly DependencyProperty CommandProperty =
DependencyProperty.RegisterAttached(
"Command",
typeof(ICommand),
typeof(AutoGeneratingColumnEventToCommandBehaviour),
new PropertyMetadata(
null,
CommandPropertyChanged));
public static void SetCommand(DependencyObject o, ICommand value)
{
o.SetValue(CommandProperty, value);
}
public static ICommand GetCommand(DependencyObject o)
{
return o.GetValue(CommandProperty) as ICommand;
}
private static void CommandPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var dataGrid = d as DataGrid;
if (dataGrid != null)
{
if (e.OldValue != null)
{
dataGrid.AutoGeneratingColumn -= OnAutoGeneratingColumn;
}
if (e.NewValue != null)
{
dataGrid.AutoGeneratingColumn += OnAutoGeneratingColumn;
}
}
}
private static void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
var dependencyObject = sender as DependencyObject;
if (dependencyObject != null)
{
var command = dependencyObject.GetValue(CommandProperty) as ICommand;
if (command != null && command.CanExecute(e))
{
command.Execute(e);
}
}
}
}
然后像这样在XAML中使用它......
<DataGrid ItemsSource="{Binding MyGridSource}"
AttachedCommand:AutoGeneratingColumnEventToCommandBehaviour.Command="{Binding CreateColumnsCommand}">
</DataGrid>