WPF ListView SelectedItems数据绑定MVVM [英] WPF ListView SelectedItems DataBinding MVVM
本文介绍了WPF ListView SelectedItems数据绑定MVVM的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这是我视图中的源代码.
Here is the source code from my View.
<ListView SelectionMode="Multiple"
ItemsSource="{Binding Items, Mode=OneWay}"
SelectedItems="{Binding SelectedItems}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Height="55" Margin="-3,0,-3,0">
<TextBlock Text="{Binding Name}"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我尝试将SelectedItems-Property
绑定到我的ViewModel
.
源代码:
I've tried to bind the SelectedItems-Property
to my ViewModel
.
Source code:
ObservableCollection<string> _selectedItems = new ObservableCollection<string>();
public ObservableCollection<string> SelectedItems
{
get { return _selectedItems; }
set
{
_selectedItems = value;
***...
need to do some operaions here ...
...***
OnPropertyChanged("SelectedItems");
}
}
我需要在SelectedItems-Property(ViewModel)
中执行一些操作.
我如何到那里?
I need to do some operations within the SelectedItems-Property(ViewModel)
.
How can I get there?
推荐答案
我们通过一个类似于以下内容的属性解决了该问题:
We solved it with an attached property which looks like:
public class MultiSelectorExtension
{
public static readonly DependencyProperty SelectedItemsProperty =
DependencyProperty.RegisterAttached("SelectedItems", typeof(INotifyCollectionChanged), typeof(MultiSelectorExtension),
new PropertyMetadata(default(INotifyCollectionChanged), OnSelectedItemsChanged));
public static void SetSelectedItems(DependencyObject element, INotifyCollectionChanged value)
{
element.SetValue(SelectedItemsProperty, value);
}
public static INotifyCollectionChanged GetSelectedItems(DependencyObject element)
{
return (INotifyCollectionChanged)element.GetValue(SelectedItemsProperty);
}
private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MultiSelector multiSelectorControl = d as MultiSelector;
NotifyCollectionChangedEventHandler handler = (sender,
args) =>
{
if (multiSelectorControl != null)
{
IList listSelectedItems = multiSelectorControl.SelectedItems;
if (args.OldItems != null)
{
foreach (var item in args.OldItems)
{
if (listSelectedItems.Contains(item))
{
listSelectedItems.Remove(item);
}
}
}
if (args.NewItems != null)
{
foreach (var item in args.NewItems)
{
if (!listSelectedItems.Contains(item))
{
listSelectedItems.Add(item);
}
}
}
}
};
if (e.OldValue == null && multiSelectorControl != null)
{
multiSelectorControl.SelectionChanged += OnSelectionChanged;
}
if (e.OldValue is INotifyCollectionChanged)
{
(e.OldValue as INotifyCollectionChanged).CollectionChanged -= handler;
}
if (e.NewValue is INotifyCollectionChanged)
{
(e.NewValue as INotifyCollectionChanged).CollectionChanged += handler;
}
}
private static void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
DependencyObject d = sender as DependencyObject;
if (GetSelectionChangedInProgress(d))
return;
// Internal Flag to avoid infinite loop
SetSelectionChangedInProgress(d, true);
dynamic selectedItems = GetSelectedItems(d);
try
{
foreach (var item in e.RemovedItems.Cast<dynamic>().Where(item => selectedItems.Contains(item)))
{
selectedItems.Remove(item);
}
}
catch (Exception)
{
}
try
{
foreach (var item in e.AddedItems.Cast<dynamic>().Where(item => !selectedItems.Contains(item)))
{
selectedItems.Add(item);
}
}
catch (Exception)
{
}
SetSelectionChangedInProgress(d, false);
}
private static readonly DependencyProperty SelectionChangedInProgressProperty =
DependencyProperty.RegisterAttached("SelectionChangedInProgress", typeof(bool), typeof(MultiSelectorExtension), new PropertyMetadata(default(bool)));
private static void SetSelectionChangedInProgress(DependencyObject element,
bool value)
{
element.SetValue(SelectionChangedInProgressProperty, value);
}
private static bool GetSelectionChangedInProgress(DependencyObject element)
{
return (bool)element.GetValue(SelectionChangedInProgressProperty);
}
}
我们在ListView
处的用法如下:
AttachedProperties:MultiSelectorExtension.SelectedItems="{Binding SelectedPersonss, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
这篇关于WPF ListView SelectedItems数据绑定MVVM的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文