83 lines
2.7 KiB
C#
83 lines
2.7 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Controls.Primitives;
|
|
|
|
namespace Wpf.Ui.Extend.UserControls
|
|
{
|
|
/// <summary>
|
|
/// 多选控件绑定选中项
|
|
/// </summary>
|
|
/// <example>
|
|
/// <c><DataGrid</c>
|
|
/// <c>local:MultiSelectorHelper.BindableSelectedItems="{Binding SelectItems, Mode=OneWayToSource}"</c>
|
|
/// <c>local:MultiSelectorHelper.MonitorSelectionChanged="True" /></c>
|
|
/// </example>
|
|
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);
|
|
}
|
|
}
|
|
}
|