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 现在只显示第二个和第三个。似乎第一个和第四个已被删除。
如果该行在(或完全注释掉)之后Models.CollectionChanged += (s, e) => View.Refresh();
移动,事情会按预期工作。 View = new ListCollectionView(Models);
为什么?
PS这是一个更大的难题的一个简单部分。在这个小例子中,我意识到我不需要调用View.Refresh();
CollectionChanged 来让 ListBox 进行自我更新。