【发布时间】:2018-08-21 11:21:53
【问题描述】:
我有一个ListView,它绑定到一个名为GunsCollection的ObservableCollection
<Grid>
<ListView x:Name="lstView" Height="300" ItemsSource="{Binding GunsCollection}">
<ListView.View>
<GridView>
<GridViewColumn Header="Gun Name" Width="120" DisplayMemberBinding="{Binding ModelName}"/>
<GridViewColumn Header="Price" Width="120" DisplayMemberBinding="{Binding UnitCost}"/>
</GridView>
</ListView.View>
</ListView>
当我在MainWindow 的构造函数中创建GunsCollection 的实例时,我的ListView 没有显示任何内容并且是空的。
public partial class MainWindow : Window
{
public ObservableCollection<Gun> GunsCollection { get; set; }
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
var GunsCollection = new ObservableCollection<Gun>() // doesn't work!
{
new Gun() {ModelName = "AK-47", UnitCost = 2700 },
new Gun() {ModelName = "M4A4", UnitCost = 3100 },
};
}
}
但是当我在声明的同一行上创建 GunsCollection 的实例时,ListView 可以工作并显示包含的所有项目。
public partial class MainWindow : Window
{
public ObservableCollection<Gun> GunsCollection { get; set; } = new ObservableCollection<Gun>();
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
GunsCollection.Add(new Gun() { ModelName = "AK-47", UnitCost = 2700 });
GunsCollection.Add(new Gun() { ModelName = "M4A4", UnitCost = 3100 });
}
}
为什么会这样?
【问题讨论】:
-
在你的第一个例子中删除
var(看起来像一个错字),然后将行设置设置为DataContextAFTER 设置GunsCollection然后它应该可以工作。您的GunsCollection属性设置器不会引发PropertyChanged事件,因此顺序很重要。您的第二个示例有效,因为Add()确实引发了CollectionChangedEvent(触发绑定更新),这就是使用ObservableCollection时“可观察”的含义。 -
我一开始没有看到
var(是的,这是我的错误)。我确实在我的视图类中实现了 INotifyPropertyChanged,但是在ObservableCollection的属性设置器中引发PropertyChanged事件是我从未听说过的。我试试看,谢谢! -
是否实现
INotifyPropertyChanged和绑定到ObservableCollection<T>与像List<T>这样的普通集合类型是单独的问题。第一个是当您想要设置属性触发绑定更新时,第二个是当您希望在更改集合中的项目时更新绑定(与集合属性本身因设置而改变无关)。