添加元素后刷新ListView

Jon*_*nas 3 c# data-binding microsoft-metro windows-runtime

我对Windows开发很新,当然甚至更新的Metro风格的应用程序开发.我不确定我理解数据绑定是如何工作的.

我有一个项目清单.

private List<Expense> _expenses = new List<Expense>();
public List<Expense> Items
{
    get
    {
        return this._expenses;
    }
}
Run Code Online (Sandbox Code Playgroud)

我绑定到XAML.(我使用拆分页面模板)

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        this.DefaultViewModel["Items"] = _data.Items;
    }
Run Code Online (Sandbox Code Playgroud)

然后我显示它

<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}"/>
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.然后当用户点击按钮时,我将新项目添加到我的列表中

_data.Items.Add(new Expense
{
    Total = 100,
    When = new DateTime(2013, 6, 6),
    For = "Myself"
});
Run Code Online (Sandbox Code Playgroud)

我期待ListView自我设置以来会自动刷新,Mode=TwoWay但事实并非如此.我是否误解了这个概念,列表不可能刷新?否则,我可能做错了什么?

Jar*_*Par 7

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

但是,实现此接口是相当复杂的.相反,你应该只使用ObservableCollection<T>代替,List<T>方案应该工作得很好

private ObservableCollection<Expense> _expenses = new ObservableCollection<Expense>();
public ObservableCollection<Expense> Items
{
    get
    {
        return this._expenses;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Jonas对象本身必须实现`INotifyPropertyChanged` (2认同)