C #:
public partial class MainWindow : Window
{
private readonly ViewModel vm;
public MainWindow()
{
InitializeComponent();
vm = new ViewModel();
DataContext = vm;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
vm.Models.RemoveAt(0);
}
}
public class ViewModel
{
public ObservableCollection<Model> Models { get; set; }
public ListCollectionView View { get; set; }
public ViewModel()
{
Models = new ObservableCollection<Model>()
{
new Model() { Name = "Gordon Freeman" },
new Model() { Name = "Isaac Kleiner" },
new Model() { Name = "Eli Vance" },
new Model() { Name = "Alyx Vance" },
};
Models.CollectionChanged += (s, e) => View.Refresh();
View = new ListCollectionView(Models);
}
}
public class Model
{
public string Name { get; set; }
public override string ToString()
{
return Name;
}
}
XAML:
<StackPanel>
<ListBox ItemsSource="{Binding Path=View}" />
<Button Click="Button_Click">Click</Button>
</StackPanel>
ObservableCollection содержит 4 элемента, а ListBox отображает все 4, как и ожидалось. Когда кнопка нажата, 1-й элемент ObservableCollection удаляется. Однако ListBox теперь отображает только 2-й и 3-й. Казалось бы, 1-й и 4-й были удалены.
Если строка Models.CollectionChanged += (s, e) => View.Refresh();
перемещена после View = new ListCollectionView(Models);
(или полностью закомментирована), все работает как положено.
Почему?
P.S. Это простая часть большой головоломки. В этом небольшом примере я понимаю, что мне не нужно вызывать View.Refresh();
на CollectionChanged, чтобы ListBox обновлялся сам.