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。