Last active
August 2, 2023 14:06
-
-
Save BYJRK/33932133a6fc1951d3a935b8f30b2d79 to your computer and use it in GitHub Desktop.
Binding SelectedItems
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections; | |
using System.Windows; | |
using System.Windows.Controls; | |
using System.Windows.Controls.Primitives; | |
namespace DataGridView | |
{ | |
public class MultiSelectorHelper | |
{ | |
#region Bindable SelectedItems | |
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 BindableSelectedItemsProperty = | |
DependencyProperty.RegisterAttached( | |
"BindableSelectedItems", | |
typeof(IList), | |
typeof(MultiSelectorHelper), | |
new PropertyMetadata(null) | |
); | |
#endregion | |
#region Monitor SelectionChanged | |
public static bool GetMonitorSelectionChanged(DependencyObject obj) | |
{ | |
return (bool)obj.GetValue(MonitorSelectionChangedProperty); | |
} | |
public static void SetMonitorSelectionChanged(DependencyObject obj, bool value) | |
{ | |
obj.SetValue(MonitorSelectionChangedProperty, value); | |
} | |
public static readonly DependencyProperty MonitorSelectionChangedProperty = | |
DependencyProperty.RegisterAttached( | |
"MonitorSelectionChanged", | |
typeof(bool), | |
typeof(MultiSelectorHelper), | |
new PropertyMetadata(false, MonitorSelectionChangedPropertyChangedCallback) | |
); | |
private static void MonitorSelectionChangedPropertyChangedCallback( | |
DependencyObject d, | |
DependencyPropertyChangedEventArgs e | |
) | |
{ | |
if (d is not MultiSelector selector) | |
throw new InvalidOperationException(); | |
if ((bool)e.NewValue) | |
selector.SelectionChanged += OnSelectionChanged; | |
else | |
selector.SelectionChanged -= OnSelectionChanged; | |
} | |
private static void OnSelectionChanged(object sender, SelectionChangedEventArgs e) | |
{ | |
var selector = (MultiSelector)sender; | |
SetBindableSelectedItems(selector, selector.SelectedItems); | |
selector.GetBindingExpression(BindableSelectedItemsProperty).UpdateSource(); | |
} | |
#endregion | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Microsoft.Xaml.Behaviors; | |
using System.Collections; | |
using System.Windows; | |
using System.Windows.Controls; | |
using System.Windows.Controls.Primitives; | |
namespace DataGridView | |
{ | |
public class SelectedItemsBehavior : Behavior<MultiSelector> | |
{ | |
protected override void OnAttached() | |
{ | |
base.OnAttached(); | |
AssociatedObject.SelectionChanged += OnSelectionChanged; | |
} | |
protected override void OnDetaching() | |
{ | |
base.OnDetaching(); | |
AssociatedObject.SelectionChanged -= OnSelectionChanged; | |
} | |
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) | |
{ | |
var name = nameof(OnSelectionChanged); | |
var func = (int x) => x.ToString(); | |
var selector = (MultiSelector)sender; | |
BindableSelectedItems = selector.SelectedItems; | |
selector.GetBindingExpression(BindableSelectedItemsProperty)?.UpdateSource(); | |
} | |
#region Bindable SelectedItems | |
public IList BindableSelectedItems | |
{ | |
get { return (IList)GetValue(BindableSelectedItemsProperty); } | |
set { SetValue(BindableSelectedItemsProperty, value); } | |
} | |
public static readonly DependencyProperty BindableSelectedItemsProperty = | |
DependencyProperty.Register( | |
nameof(BindableSelectedItems), | |
typeof(IList), | |
typeof(SelectedItemsBehavior), | |
new PropertyMetadata(null) | |
); | |
public static int GetMyProperty(DependencyObject obj) | |
{ | |
return (int)obj.GetValue(MyPropertyProperty); | |
} | |
public static void SetMyProperty(DependencyObject obj, int value) | |
{ | |
obj.SetValue(MyPropertyProperty, value); | |
} | |
public static readonly DependencyProperty MyPropertyProperty = | |
DependencyProperty.RegisterAttached( | |
"MyProperty", | |
typeof(int), | |
typeof(SelectedItemsBehavior), | |
new PropertyMetadata(0) | |
); | |
#endregion | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment