Last active
May 22, 2025 13:34
-
-
Save BYJRK/33932133a6fc1951d3a935b8f30b2d79 to your computer and use it in GitHub Desktop.
Binding SelectedItems
This file contains hidden or 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 hidden or 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 | |
| } | |
| } |
` 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>`
我按照视频上写法 发现里面获取绑定一直为 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
我按照视频上写法 发现里面获取绑定一直为NULL,让ChatGpt 优化了一下也是一直为空。找不到问题出现再那里