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 つすべてが表示されています。ボタンをクリックすると、ObservableCollection の最初の要素が削除されます。ただし、ListBox は現在、2 番目と 3 番目のみを表示しています。1番目と4番目が削除されたようです。
行が後Models.CollectionChanged += (s, e) => View.Refresh();
に移動された(または完全にコメントアウトされた) 場合、期待どおりに機能します。 View = new ListCollectionView(Models);
なんで?
PS これは大きなパズルの単純なピースです。View.Refresh();
この小さな例では、ListBox 自体を更新するために CollectionChangedを呼び出す必要がないことに気付きました。