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