106 lines
3.5 KiB
C#
106 lines
3.5 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 System.Windows.Interactivity;
|
|||
|
|
|||
|
namespace MECF.Framework.UI.Core.ExtendedControls
|
|||
|
{
|
|||
|
public class BindableSelectedItemBehavior : Behavior<TreeView>
|
|||
|
{
|
|||
|
#region SelectedItem Property
|
|||
|
|
|||
|
public object SelectedItem
|
|||
|
{
|
|||
|
get { return (object)GetValue(SelectedItemProperty); }
|
|||
|
set { SetValue(SelectedItemProperty, value); }
|
|||
|
}
|
|||
|
|
|||
|
public static readonly DependencyProperty SelectedItemProperty =
|
|||
|
DependencyProperty.Register("SelectedItem", typeof(object), typeof(BindableSelectedItemBehavior), new UIPropertyMetadata(null, OnSelectedItemChanged));
|
|||
|
|
|||
|
private static void OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
|
|||
|
{
|
|||
|
var item = e.NewValue as TreeViewItem;
|
|||
|
if (item != null)
|
|||
|
{
|
|||
|
item.SetValue(TreeViewItem.IsSelectedProperty, true);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
protected override void OnAttached()
|
|||
|
{
|
|||
|
base.OnAttached();
|
|||
|
|
|||
|
this.AssociatedObject.SelectedItemChanged += OnTreeViewSelectedItemChanged;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnDetaching()
|
|||
|
{
|
|||
|
base.OnDetaching();
|
|||
|
|
|||
|
if (this.AssociatedObject != null)
|
|||
|
{
|
|||
|
this.AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
|
|||
|
{
|
|||
|
this.SelectedItem = e.NewValue;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class TreeViewHelper
|
|||
|
{
|
|||
|
private static Dictionary<DependencyObject, TreeViewSelectedItemBehavior> behaviors = new Dictionary<DependencyObject, TreeViewSelectedItemBehavior>();
|
|||
|
|
|||
|
public static object GetSelectedItem(DependencyObject obj)
|
|||
|
{
|
|||
|
return (object)obj.GetValue(SelectedItemProperty);
|
|||
|
}
|
|||
|
|
|||
|
public static void SetSelectedItem(DependencyObject obj, object value)
|
|||
|
{
|
|||
|
obj.SetValue(SelectedItemProperty, value);
|
|||
|
}
|
|||
|
|
|||
|
// Using a DependencyProperty as the backing store for SelectedItem. This enables animation, styling, binding, etc...
|
|||
|
public static readonly DependencyProperty SelectedItemProperty =
|
|||
|
DependencyProperty.RegisterAttached("SelectedItem", typeof(object), typeof(TreeViewHelper), new UIPropertyMetadata(null, SelectedItemChanged));
|
|||
|
|
|||
|
private static void SelectedItemChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
|
|||
|
{
|
|||
|
if (!(obj is TreeView))
|
|||
|
return;
|
|||
|
|
|||
|
if (!behaviors.ContainsKey(obj))
|
|||
|
behaviors.Add(obj, new TreeViewSelectedItemBehavior(obj as TreeView));
|
|||
|
|
|||
|
TreeViewSelectedItemBehavior view = behaviors[obj];
|
|||
|
view.ChangeSelectedItem(e.NewValue);
|
|||
|
}
|
|||
|
|
|||
|
private class TreeViewSelectedItemBehavior
|
|||
|
{
|
|||
|
TreeView view;
|
|||
|
public TreeViewSelectedItemBehavior(TreeView view)
|
|||
|
{
|
|||
|
this.view = view;
|
|||
|
view.SelectedItemChanged += (sender, e) => SetSelectedItem(view, e.NewValue);
|
|||
|
}
|
|||
|
|
|||
|
internal void ChangeSelectedItem(object p)
|
|||
|
{
|
|||
|
TreeViewItem item = (TreeViewItem)view.ItemContainerGenerator.ContainerFromItem(p);
|
|||
|
item.IsSelected = true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|