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