using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using Microsoft.Xaml.Behaviors; namespace SWS.Commons.Helper.Behaviours { /// /// 让 WPF TreeView 支持 SelectedItem 双向绑定的行为类。 /// 应用于 TreeView 后,可在 ViewModel 中直接使用绑定方式访问/设置选中项。 /// public static class TreeViewSelectedItemBehavior { public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.RegisterAttached( "SelectedItem", typeof(object), typeof(TreeViewSelectedItemBehavior), new FrameworkPropertyMetadata( null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSelectedItemChanged)); // 获取附加属性值 public static object GetSelectedItem(TreeView treeView) => treeView.GetValue(SelectedItemProperty); // 设置附加属性值 public static void SetSelectedItem(TreeView treeView, object value) => treeView.SetValue(SelectedItemProperty, value); // 属性变化时的事件处理 private static void OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if (sender is TreeView treeView) { // 解耦旧事件处理器 treeView.SelectedItemChanged -= OnTreeViewSelectedItemChanged; // 连接新事件处理器 treeView.SelectedItemChanged += OnTreeViewSelectedItemChanged; } } // TreeView选择项变化时的处理 private static void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) { var treeView = (TreeView)sender; // 更新附加属性值 treeView.SetCurrentValue(SelectedItemProperty, e.NewValue); } } }