我正在尝试创建一个具有以下功能的DataGrid:
我认为使用ICommand是个好主意,所以我创建了一个像这样的DataGrid:
public class MyDataGrid : DataGrid {
public static readonly RoutedCommand NewEntry = new RoutedCommand();
public static readonly RoutedCommand EditEntry = new RoutedCommand();
public static readonly RoutedCommand DeleteEntry = new RoutedCommand();
public MyDataGrid() {
CommandBindings.Add(new CommandBinding(NewEntry, ..., ...));
CommandBindings.Add(new CommandBinding(EditEntry, ..., ...));
CommandBindings.Add(new CommandBinding(DeleteEntry, ..., ...));
InputBindings.Add(new InputBinding(DeleteCommand, new KeyGesture(Key.Delete)));
InputBindings.Add(new MouseBinding(EditEntry, new MouseGesture(MouseAction.LeftDoubleClick)));
// ContextMenu..working fine
}
}
然后我意识到,双击一行是行不通的,所以我添加了这个:
LoadingRow += (s, e) =>
e.Row.InputBindings.Add(new MouseBinding(EditEntry,
new MouseGesture(MouseAction.LeftDoubleClick)));
当然删除键也不起作用,我补充说:
PreviewKeyDown += (s, e) => { if(e.Key == Key.Delete) { ... } };
为什么我必须这样做?使用命令来阻止这种事件的黑客攻击不是全部吗?我想念一下吗?
在我简单完美的世界中,我想在CanExecute方法中决定是否适合处理命令,而不是订阅大量不同的事件处理程序。
答案 0 :(得分:1)
通常我会使用DataGridCell
Style
以下是使用自定义AttachedCommandBehavior
的示例<Style TargetType="{x:Type DataGridCell}">
<Setter Property="my:CommandBehavior.Command" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MyView}}, Path=DataContext.ShowPopupCommand}" />
<Setter Property="my:CommandBehavior.CommandParameter" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Path=DataContext}" />
<Setter Property="my:CommandBehavior.Event" Value="MouseDoubleClick" />
</Style>
我不记得为什么我把它连接到Cell而不是Row,但我确信有一个原因。你可以尝试将事件附加到Row,看看会发生什么。