using System; using System.Collections; using System.Linq; using System.Windows; using System.Windows.Controls.Primitives; namespace Szmedi.RvKits.AttachProps { class BindingSelectItems { public static IList GetSelectItemsAttach(DependencyObject obj) { return (IList)obj.GetValue(SelectItemsAttachProperty); } public static void SetSelectItemsAttach(DependencyObject obj, IList value) { obj.SetValue(SelectItemsAttachProperty, value); } // Using a DependencyProperty as the backing store for SelectItemsAttach. This enables animation, styling, binding, etc... public static readonly DependencyProperty SelectItemsAttachProperty = DependencyProperty.RegisterAttached("SelectItemsAttach", typeof(IList), typeof(BindingSelectItems), new PropertyMetadata(null)); public static bool GetSelectedChange(DependencyObject obj) { return (bool)obj.GetValue(SelectedChangeProperty); } public static void SetSelectedChange(DependencyObject obj, bool value) { obj.SetValue(SelectedChangeProperty, value); } // Using a DependencyProperty as the backing store for SelectedChange. This enables animation, styling, binding, etc... public static readonly DependencyProperty SelectedChangeProperty = DependencyProperty.RegisterAttached("SelectedChange", typeof(bool), typeof(BindingSelectItems), new PropertyMetadata(false, SelectedChangedCallBack)); private static void SelectedChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is MultiSelector) { MultiSelector multiSelector = (MultiSelector)d; if ((bool)e.NewValue) { multiSelector.SelectionChanged += MultiSelector_SelectionChanged; } else { multiSelector.SelectionChanged -= MultiSelector_SelectionChanged; } } else { throw new InvalidOperationException(); } } private static void MultiSelector_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { MultiSelector multiSelector = (MultiSelector)sender; SetSelectItemsAttach(multiSelector, multiSelector.SelectedItems); System.Windows.Data.BindingExpression bind = multiSelector.GetBindingExpression(SelectItemsAttachProperty); bind?.UpdateSource(); } } }