我对Windows开发很陌生,当然甚至更新的Metro风格应用程序开发。我不确定我理解数据绑定的工作原理。
我有一个项目列表。
private List<Expense> _expenses = new List<Expense>();
public List<Expense> Items
{
get
{
return this._expenses;
}
}
我绑定到XAML。 (我使用拆分页面模板)
protected override void OnNavigatedTo(NavigationEventArgs e)
{
this.DefaultViewModel["Items"] = _data.Items;
}
然后我显示它
<UserControl.Resources>
<CollectionViewSource
x:Name="itemsViewSource"
Source="{Binding Items, Mode=TwoWay}"/>
</UserControl.Resources>
<ListView
x:Name="itemListView"
AutomationProperties.AutomationId="ItemsListView"
AutomationProperties.Name="Items"
Margin="120,0,0,60"
ItemsSource="{Binding Source={StaticResource itemsViewSource}}"
SelectionChanged="ItemListView_SelectionChanged"
ItemTemplate="{StaticResource DefaultListItemTemplate}"/>
哪个工作正常。然后,当用户点击按钮时,我将新项目添加到我的列表中
_data.Items.Add(new Expense
{
Total = 100,
When = new DateTime(2013, 6, 6),
For = "Myself"
});
我期待ListView
自动刷新,因为我设置Mode=TwoWay
但事实并非如此。我是否误解了这个概念,列表不可能刷新?否则,我可能做错了什么?
答案 0 :(得分:7)
为了在更改集合后更新UI,您需要实现INotifyCollectionChanged
。这将在发生更改时通知UI,并且它将通过在更改之上重新绑定UI来响应。
但实现此接口是相当复杂的。相反,您应该使用ObservableCollection<T>
代替List<T>
,方案应该可以正常工作
private ObservableCollection<Expense> _expenses = new ObservableCollection<Expense>();
public ObservableCollection<Expense> Items
{
get
{
return this._expenses;
}
}