gpt4 book ai didi

c# - WPF 从具有双向绑定(bind)的 ViewModel 中选择 DataGrid 中的多个项目

转载 作者:行者123 更新时间:2023-12-03 10:31:09 25 4
gpt4 key购买 nike

我正在尝试为 WPF DataGrid 中的选定项目创建双向绑定(bind).我希望能够从 ViewModel 中选择多个项目也来自实际的UserControl .我知道我不能直接设置选定的项目,因为这个属性是只读的。
我正在考虑绑定(bind)到 DependencyProperty并订阅 SelectionChanged DataGrid 的事件在后面的代码中。

<UserControl.Resources>
<Style TargetType="local:ListView">
<Setter Property="SelectedItems" Value="{Binding SelectedItemsVM, Mode=TwoWay}"/>
</Style>
</UserControl.Resources>

<DataGrid Name="ObjectListDataGrid" SelectionChanged="OnSelectionChanged">
在后面的代码中,我创建了 DependencyProperty .设置后,我订阅 CollectionChanged事件。
public ObservableCollection<object> SelectedItems
{
get { return (ObservableCollection<object>)GetValue(SelectedItemsProperty); }
set { SetValue(SelectedItemsProperty, value); }
}

public static readonly DependencyProperty SelectedItemsProperty =
DependencyProperty.Register("SelectedItems", typeof(ObservableCollection<object>), typeof(ListView), new PropertyMetadata(default(ObservableCollection<object>), OnSelectedItemsChanged));

private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var collection = e.NewValue as ObservableCollection<object>;
if (collection != null)
{
collection.CollectionChanged -= OnSelectedItemsCollectionChanged;
collection.CollectionChanged += OnSelectedItemsCollectionChanged;
}
}
我使用 EventHandlerSelectionChanged DataGrid 的事件添加/删除集合中的项目。
private void OnSelectionChanged(object sender, SelectionChangedEventArgs args)
{
SelectedItems.Remove(args.RemovedItems);
SelectedItems.Add(args.AddedItems);
}
现在我想选择 OnSelectedItemsCollectionChanged 中所需的行集合更改时的方法。
private static void OnSelectedItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
foreach (DataGridRow row in ObjectListDataGrid.Rows())
{
if(ObjectListDataGrid.SelectedItems.Contains(row.Item))
row.IsSelected = true;
else
row.IsSelected = false;
}
}
问题:
由于 OnSelectedItemsCollectionChanged方法是静态的,我无权访问 ObjectListDataGrid .有没有办法克服这个问题,或者以不同的方式做到这一点?
为了完整起见, DataGrid.Rows()方法是获取行列表的扩展方法:
public static IEnumerable<DataGridRow> Rows(this DataGrid grid)
{
var itemsSource = grid.ItemsSource as IEnumerable;
if (null == itemsSource) yield return null;
foreach (var item in itemsSource)
{
var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
if (null != row) yield return row;
}
}

最佳答案

您的 OnSelectedItemsCollectionChanged方法不能是静态的。
DependencyObject OnSelectedItemsChanged 的参数ListView 类的方法。还要确保将处理程序与 SelectedItems 的旧值分离。属性(property)。

private static void OnSelectedItemsChanged(
DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var listView = (ListView)d;
var oldCollection = (INotifyCollectionChanged)e.OldValue;
var newCollection = (INotifyCollectionChanged)e.NewValue;

if (oldCollection != null)
{
oldCollection.CollectionChanged -= listView.OnSelectedItemsCollectionChanged;
}

if (newCollection != null)
{
newCollection.CollectionChanged += listView.OnSelectedItemsCollectionChanged;
}
}

private void OnSelectedItemsCollectionChanged(
object sender, NotifyCollectionChangedEventArgs e)
{
foreach (var row in ObjectListDataGrid.Rows())
{
row.IsSelected = ObjectListDataGrid.SelectedItems.Contains(row.Item);
}
}

关于c# - WPF 从具有双向绑定(bind)的 ViewModel 中选择 DataGrid 中的多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64368174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com