Skip to content

Instantly share code, notes, and snippets.

@BYJRK
Last active August 2, 2023 14:06
Show Gist options
  • Save BYJRK/33932133a6fc1951d3a935b8f30b2d79 to your computer and use it in GitHub Desktop.
Save BYJRK/33932133a6fc1951d3a935b8f30b2d79 to your computer and use it in GitHub Desktop.
Binding SelectedItems
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
}
}
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