2012-04-17 40 views
3

私はWindows開発には新しく、もちろんMetroスタイルのアプリケーション開発にはさらに新しくなっています。私はデータバインディングがどのように機能するのか分かりません。要素が追加された後にListViewを更新する

私はアイテムのリストを持っています。

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}"/> 

を表示します。ユーザーがボタンをクリックするととき、私は私がMode=TwoWayを設定するのでListViewが自動的にリフレッシュすることを期待していた

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

私のリストに新しい項目を追加しますが、それはしません。私は概念を誤解していましたが、リストをリフレッシュすることはできませんでしたか?さもなければ、私は何が間違っていますか?

答えて

7

コレクションを変更した後にUIを更新するには、INotifyCollectionChangedを実装する必要があります。これにより、変更が発生したときにUIに通知され、変更の最上位にUIを再バインドすることで応答します。

このインターフェイスの実装はかなり複雑です。代わりにList<T>の代わりにObservableCollection<T>を使用し、シナリオはうまくいくはずです

private ObservableCollection<Expense> _expenses = new ObservableCollection<Expense>(); 
public ObservableCollection<Expense> Items 
{ 
    get 
    { 
     return this._expenses; 
    } 
} 
+0

大変感謝しています。同じテーマで、オブジェクト自体が変更されたときに通知する方法は? – Jonas

+2

@Jonasオブジェクト自体は 'INotifyPropertyChanged'を実装する必要があります – JaredPar

+0

素晴らしいです。ありがとう@ JaredPar – Jonas

関連する問題