3

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

4

1 回答 1

7

为了在对集合进行更改后更新 UI,您需要实现它INotifyCollectionChanged。这将在发生更改时通知 UI,并通过在更改之上重新绑定 UI 来响应。

不过,实现这个接口是相当复杂的。相反,您应该只使用ObservableCollection<T>代替,List<T>并且该场景应该可以正常工作

private ObservableCollection<Expense> _expenses = new ObservableCollection<Expense>();
public ObservableCollection<Expense> Items
{
    get
    {
        return this._expenses;
    }
}
于 2012-04-17T14:19:45.273 回答