Diego Torres 的回答简洁明了!但是对于那些不想为此目的安装 NuGet 包的人,您可以创建自己的依赖属性,在触发偶数时执行命令。
namespace View.Helper
{
public class EventToCommandAdaptor
{
public static readonly DependencyProperty TreeViewSelectedItemChangedCommand_DpProp =
DependencyProperty.RegisterAttached(
"TreeViewSelectedItemChangedCommand",
typeof(ICommand),
typeof(EventToCommandAdaptor), // owner type
new PropertyMetadata(new PropertyChangedCallback(AttachOrRemoveTreeViewSelectedItemChangedEvent))
);
public static ICommand GetTreeViewSelectedItemChangedCommand(DependencyObject obj)
{
return (ICommand)obj.GetValue(TreeViewSelectedItemChangedCommand_DpProp);
}
public static void SetTreeViewSelectedItemChangedCommand(DependencyObject obj, ICommand value)
{
obj.SetValue(TreeViewSelectedItemChangedCommand_DpProp, value);
}
public static void AttachOrRemoveTreeViewSelectedItemChangedEvent(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
TreeView treeview = obj as TreeView;
if (treeview != null)
{
ICommand cmd = (ICommand)args.NewValue;
if (args.OldValue == null && args.NewValue != null)
{
treeview.SelectedItemChanged += ExecuteTreeViewSelectedItemChanged;
}
else if (args.OldValue != null && args.NewValue == null)
{
treeview.SelectedItemChanged -= ExecuteTreeViewSelectedItemChanged;
}
}
}
private static void ExecuteTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> args)
{
DependencyObject obj = sender as DependencyObject;
ICommand cmd = (ICommand)obj.GetValue(TreeViewSelectedItemChangedCommand_DpProp);
if (cmd != null)
{
if (cmd.CanExecute(args.NewValue))
{
cmd.Execute(args.NewValue);
}
}
}
}
}
包括xmlns:vh="clr-namespace:View.Helper"
在<Windows></Windows>
TreeView 看起来像:
<TreeView ItemsSource="{Binding MyItemSource}"
vh:EventToCommandAdaptor.TreeViewSelectedItemChangedCommand="{Binding MyCommand}">
</TreeView>
我在遇到类似情况时学会了这个技巧:我想在触发 DataGrid.MouseDoubleClick 事件时执行命令。但是很抱歉我忘了标出来源。