ツリービューのアイテム選択イベントをコマンドでバインディング可能にする。
TreeViewSelectedItemBehavior.cs
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace Maywork.WPF.Helpers;
public static class TreeViewSelectedItemBehavior
{
public static readonly DependencyProperty SelectedItemChangedCommandProperty =
DependencyProperty.RegisterAttached(
"SelectedItemChangedCommand",
typeof(ICommand),
typeof(TreeViewSelectedItemBehavior),
new PropertyMetadata(null, OnChanged));
public static void SetSelectedItemChangedCommand(DependencyObject obj, ICommand value)
=> obj.SetValue(SelectedItemChangedCommandProperty, value);
public static ICommand GetSelectedItemChangedCommand(DependencyObject obj)
=> (ICommand)obj.GetValue(SelectedItemChangedCommandProperty);
private static void OnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is not TreeView tree) return;
tree.SelectedItemChanged -= OnSelectedItemChanged;
if (e.NewValue != null)
{
tree.SelectedItemChanged += OnSelectedItemChanged;
}
}
private static void OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (sender is not TreeView tree) return;
var cmd = GetSelectedItemChangedCommand(tree);
if (cmd == null) return;
if (cmd.CanExecute(e.NewValue))
{
cmd.Execute(e.NewValue);
}
}
}
Download


コメント