Ich verfolge ListView-Auswahländerungen in einem MVVM-Design, indem ich an IsSelected binde. Ich muss das aktuelle Element auch verfolgen, indem ich IsSynchronizedWithCurrentItem aktiviere.MVVM: Bindung an List IsSelected beim Verfolgen IsSynchronizedWithCurrentItem
Ich finde, dass, wenn ich zwei Listview auf die gleiche Sammlung Bindung Ich erhalte die InvalidOperationException: „Sammlung modifiziert wurde; Enumerationsvorgang ausführen kann nicht“ Es scheint ein synchonization Fehler zwischen den beiden Listviews zu sein; einer löst ein PropertyChanged-Ereignis aus, während der andere den Selector vielleicht aktualisiert?
Ich kann nicht herausfinden, wie man anders als die Verwendung von IsSynchronizedWithCurrentItem verzichten und es selbst verwalten. Irgendwelche Ideen?
Danke.
Das Ansichtsmodell und Code hinter:
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<Item>()
{
new Item(){Name = "Foo"},
new Item(){Name = "Bar"}
};
}
public ObservableCollection<Item> Items { get; private set; }
}
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
Die XAML:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="100" Width="100">
<StackPanel>
<ListView DataContext="{Binding Items}" ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="True" SelectionMode="Single">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name, Mode=OneWay}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<ListView DataContext="{Binding Items}" ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="True" SelectionMode="Single">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name, Mode=OneWay}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Window>
Ja, tatsächlich bin ich gerade dabei, das Problem zu lösen. Ich würde hinzufügen, dass es für mich notwendig ist, das CollectionChanged-Ereignis bei Items zu überwachen, um die PropertyChanged-Registrierung hinzuzufügen oder zu entfernen, wenn sich die Sammlung ändert. – Terrence
@terrence du solltest seine antwort annehmen, wenn das so funktioniert :) hast du im letzten jahr einen besseren weg gefunden? –