添加元素后刷新ListView

时间:2012-04-17 14:12:45

标签: c# data-binding microsoft-metro windows-runtime

我对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但事实并非如此。我是否误解了这个概念,列表不可能刷新?否则,我可能做错了什么?

1 个答案:

答案 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;
    }
}