| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | 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;            }        }    }}
 |