58 lines
2.1 KiB
C#
58 lines
2.1 KiB
C#
![]() |
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
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 让 WPF TreeView 支持 SelectedItem 双向绑定的行为类。
|
|||
|
/// 应用于 TreeView 后,可在 ViewModel 中直接使用绑定方式访问/设置选中项。
|
|||
|
/// </summary>
|
|||
|
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<object> e)
|
|||
|
{
|
|||
|
var treeView = (TreeView)sender;
|
|||
|
// 更新附加属性值
|
|||
|
treeView.SetCurrentValue(SelectedItemProperty, e.NewValue);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|