MVVM:在跟踪IsSynchronizedWithCurrentItem时绑定到List IsSelected
我通过绑定到IsSelected来跟踪MVVM设计中的ListView选择更改。 我还需要通过启用IsSynchronizedWithCurrentItem来跟踪当前项。
我发现当我有两个ListView绑定到同一个集合时,我得到了InvalidOperationException : “集合被修改;枚举操作可能无法执行。 ”这似乎是两个ListView之间的同步错误; 一个是触发PropertyChanged事件而另一个是更新Selector?
除了放弃使用IsSynchronizedWithCurrentItem并自行管理之外,我无法弄清楚如何解决这个问题。 有任何想法吗?
谢谢。
ViewModel和代码背后:
public class Item : INotifyPropertyChanged { public string Name{ get; set; } public bool IsSelected { get { return isSelected; } set { isSelected = value; OnPropertyChanged("IsSelected"); } } private bool isSelected; public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public class ViewModel { public ViewModel() { Items = new ObservableCollection() { new Item(){Name = "Foo"}, new Item(){Name = "Bar"} }; } public ObservableCollection Items { get; private set; } } public partial class Window1 : Window { public Window1() { InitializeComponent(); DataContext = new ViewModel(); } }
XAML:
我无法直接解决您的问题。 但是,我确实有一个可行的解决方案。
你可以做的是在View Model上引入一个名为’SelectedItem’的第二个属性,它将保存对ListView中选择的Item的引用。 此外,在View Model中,您可以监听PropertyChanged事件。 如果关联的属性名称为IsSelected,则将SelectedItem属性更新为该事件的发送者(现在具有IsSelected的项= true)。 然后,您可以将ListView的SelectedItem属性绑定到ViewModel类的同名属性。
修改后的ViewModel类的代码如下所示。
public class ViewModel : INotifyPropertyChanged { private Item _selectedItem; public ViewModel() { Items = new ObservableCollection- () { new Item {Name = "Foo"}, new Item {Name = "Bar"} }; foreach ( Item anItem in Items ) { anItem.PropertyChanged += OnItemIsSelectedChanged; } } public ObservableCollection
- Items { get; private set; } public Item SelectedItem { get { return _selectedItem; } set { // only update if the value is difference, don't // want to send false positives if ( _selectedItem == value ) { return; } _selectedItem = value; OnPropertyChanged("SelectedItem"); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnItemIsSelectedChanged(object sender, PropertyChangedEventArgs e) { if ( e.PropertyName != "IsSelected" ) { return; } SelectedItem = sender as Item; } private void OnPropertyChanged(string propertyName) { if ( PropertyChanged != null ) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
绑定到列表框的IsSelected
并使用SelectionMode='Single'
时似乎会发生此问题
我发现更改SelectionMode = 'Multiple'
然后只是向ViewModel添加了逻辑,以确保只有一个项目的IsSelected设置为true working。
- 是否真的需要.net core 2 API中的services.AddSingleton
- 如何使用async / await来调用Web服务?
- Azure webrole循环和“无法加载文件或程序集System.Web.Http 5.2.0.0”
- 为什么auth中间件声明的顺序在Owin Startup类中很重要?
- 从其他接口inheritance的接口的显式C#接口实现
- 元素中“Project”属性的值“”无效。 vs2012
- 关闭和清理Socket连接的正确方法是什么?
- FileStream.Flush()和FileStream.Flush(True)之间有什么区别?
- 将Resources.resx中的BitmapImage分配给Image.Source?