using System; using System.Collections; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; namespace Wpf.Ui.Extend.UserControls { /// /// 多选控件绑定选中项 /// /// /// /// local:MultiSelectorHelper.BindableSelectedItems="{Binding SelectItems, Mode=OneWayToSource}" /// local:MultiSelectorHelper.MonitorSelectionChanged="True" /> /// public class MultiSelectorHelper : DependencyObject { public static readonly DependencyProperty BindableSelectedItemsProperty = DependencyProperty.Register( "BindableSelectedItems", typeof(IList), typeof(MultiSelectorHelper), new PropertyMetadata(default(IList)) ); public static IList GetBindableSelectedItems(DependencyObject obj) { return (IList)obj.GetValue(BindableSelectedItemsProperty); } public static void SetBindableSelectedItems(DependencyObject obj, IList value) { obj.SetValue(BindableSelectedItemsProperty, value); } public static readonly DependencyProperty MonitorSelectionChangedProperty = DependencyProperty.RegisterAttached( "SetMonitorSelectionChanged", typeof(bool), typeof(MultiSelectorHelper), new PropertyMetadata(false, MonitorSelectionChangedPropertyChangedCallBack) ); private static void MonitorSelectionChangedPropertyChangedCallBack( DependencyObject d, DependencyPropertyChangedEventArgs e ) { if (d is not MultiSelector selector) { throw new NotImplementedException(); } if ((bool)e.NewValue) { selector.SelectionChanged += Selector_SelectionChanged; } else { selector.SelectionChanged -= Selector_SelectionChanged; } } private static void Selector_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (sender is MultiSelector selector) { SetBindableSelectedItems(selector, selector.SelectedItems); selector.GetBindingExpression(BindableSelectedItemsProperty).UpdateSource(); } } public static void SetMonitorSelectionChanged(DependencyObject element, bool value) { element.SetValue(MonitorSelectionChangedProperty, value); } public static bool GetMonitorSelectionChanged(DependencyObject element) { return (bool)element.GetValue(MonitorSelectionChangedProperty); } } }