Skip to content

Instantly share code, notes, and snippets.

@BYJRK
Last active May 22, 2025 13:34
Show Gist options
  • Select an option

  • Save BYJRK/33932133a6fc1951d3a935b8f30b2d79 to your computer and use it in GitHub Desktop.

Select an option

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
}
}
@lixingzhao123
Copy link

lixingzhao123 commented Nov 15, 2024

我按照视频上写法 发现里面获取绑定一直为NULL,让ChatGpt 优化了一下也是一直为空。找不到问题出现再那里

@lixingzhao123
Copy link

lixingzhao123 commented Nov 15, 2024

` public class DataGridSelectItemsBehavior : Behavior
{
public static readonly DependencyProperty MySlectItemsProperty =
DependencyProperty.Register("MySlectItems", typeof(IList), typeof(DataGridSelectItemsBehavior), new PropertyMetadata(null));

  public static readonly DependencyProperty SelectIndexProperty =
      DependencyProperty.Register("SelectIndex", typeof(int), typeof(DataGridSelectItemsBehavior), new PropertyMetadata(-1));

  public IList MySlectItems
  {
      get { return (IList)GetValue(MySlectItemsProperty); }
      set { SetValue(MySlectItemsProperty, value); }
  }

  public int SelectIndex
  {
      get { return (int)GetValue(SelectIndexProperty); }
      set { SetValue(SelectIndexProperty, value); }
  }

  protected override void OnAttached()
  {
      base.OnAttached();
      AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
  }

  private void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
  {
      var dataGrid = sender as DataGrid;
      if (dataGrid != null)
      {
          MySlectItems = dataGrid.SelectedItems;
          SelectIndex = dataGrid.SelectedIndex;
          var s = dataGrid.GetBindingExpression(MySlectItemsProperty);
      }

  }

  protected override void OnDetaching()
  {
      base.OnDetaching();
      AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;
  }

}`

`

        <i:Interaction.Behaviors>

            <local:DataGridSelectItemsBehavior MySlectItems="{Binding UserSelectedItems1, Mode=TwoWay}" SelectIndex="{Binding Select, Mode=TwoWay}" />
        </i:Interaction.Behaviors>
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Index}" Header="序号" />
            <DataGridTextColumn Binding="{Binding Age}" Header="年龄" />
            <DataGridTextColumn Binding="{Binding Salary}" Header="工资" />
            <DataGridTextColumn Binding="{Binding Phone}" Header="电话" />
            <DataGridTextColumn Binding="{Binding Address}" Header="住址" />

        </DataGrid.Columns>

    </DataGrid>`

@dlgcy
Copy link

dlgcy commented Mar 27, 2025

我按照视频上写法 发现里面获取绑定一直为 NULL,让 ChatGpt 优化了一下也是一直为空。找不到问题出现再那里

UpdateSource 应按照如下写法,但其实是不需要的。
//var bindingExp = BindingOperations.GetBindingExpression(this, BindableSelectedItemsProperty);
//bindingExp?.UpdateSource();

VM 中绑定的值类型需要是 IList,且不能是泛型的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment