2016-04-15 19 views
0

winrtのプログラミングには初めてです。 VS2015を使用して、ObservableCollectionでいくつかのテストを行い、コレクションの変更がUIにどのように反映されたかを確認しています。私は間違って何かをしているに違いない。何が分からないのか。ObservableCollection - データセットの変更が更新されない

これは私のモデルである:MainPage.xamlをオン

class MyItems 
{ 
    public int ItemID { get; set; } 
    public string ItemDescription { get; set; } 
} 
class MyItemList:List<MyItems> 
{ 
    public MyItemList() 
    { 
     Random r = new Random(DateTime.Now.Day); 
     for (int i = 0; i < r.Next(10)+1; i++) 
     { 
      this.Add(new MyItems() { ItemID = i + 1, 
       ItemDescription = string.Format("Item_{0}", i + 1) }); 
     } 
    } 
    public ObservableCollection<MyItems> getEven() 
    { 
     return new ObservableCollection<MyItems>(this.Where(x=>x.ItemID%2==0).ToList()); 
    } 

    public void AddMoreItems(int v) 
    { 
     int total = this.Count; 
     for (int i = 0 ; i < v; i++) 
     { 
      this.Add(new MyItems() { ItemID = total + i, ItemDescription = string.Format("Item_{0}", total+i) }); 
     } 
    } 
} 

、私はリストに項目を追加するためのボタンがあります。プログラムでリストビューを作成し、データセットに2つの方法でバインドしました。

public sealed partial class MainPage : Page 
{ 
    static MyItemList myItems = new MyItemList(); 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     var t = myItems.getEven(); 
     ListView myListView = new ListView() { ItemTemplate = (DataTemplate)Resources["myItemTemplate"] }; 
     myListView.DataContext = t; 
     var binding = new Binding(); 
     binding.Source = t; 
     binding.Mode = BindingMode.TwoWay; 
     myListView.SetBinding(ListView.ItemsSourceProperty, binding); 
     MyGrid.Children.Add(myListView); 
    } 

    private void AddItems_Click(object sender, RoutedEventArgs e) 
    { 
     myItems.AddMoreItems(3); 
    } 
} 

ボタンをクリックすると、3つのアイテムが追加されますが、リストビューには反映されません。 ObservableCollectionを使用して双方向にバインディングを設定することのほかに何かを行う必要がありますか?

答えて

1

あなたの問題は、基本的に、ここにある:あなたがthisを照会し、ToList()を呼び出すと

public ObservableCollection<MyItems> getEven() 
{ 
    return new ObservableCollection<MyItems>(this.Where(x=>x.ItemID%2==0).ToList()); 
} 

、あなたは元から独立した新しいリストを作成しています。アイテムをオリジナルに追加すると、それは派生リストに反映されません。それをこのように考える:thisに追加

public ObservableCollection<MyItems> getEven() 
{ 
    var filteredList = this.Where(x=>x.ItemID%2==0).ToList() 
    return new ObservableCollection<MyItems>(filteredList); 
} 

は、すべての内容filteredListを変更するつもりはありません。

さらに、既存の値を変更する代わりにgetEvenにアクセスするたびに、新しいObservableCollectionを作成すると、観察可能なコレクションに追加および削除するときのイベントは発生しません。

観測可能なコレクションは根本的に間違った方法で使用しています。単にMyItemListList<T>の代わりにObservableCollection<T>から派生させてみませんか?

Collection that inherits from ObservableCollection - What are the benefits?

あなたが偶数/奇数でフィルタしようとしている場合も、あなたは情報をお寄せいただきありがとうございポールICollectionView

WPF Binding filtered ObservableCollection ICollectionView to Combobox

+0

になっているはずです。私はWinRTでプログラミングするのが初めてであるため、ObservableCollectionを誤用している可能性があります。最初に、ObservableCollectionからMyItemListを派生させた場合、アイテムが親セットMyItemListに追加された場合、getEvenのデータフィルタリングセットが更新されるのですか、それともまだICollectionViewを使用する必要がありますか?第2に、アイテムがMyItemListに追加されたときにICollectionView(ObservableCollectionからMyItemListを派生しない)のみを使用すると、フィルタリングセットが更新されますか?再度、感謝します! – user1205746

+0

気にしないでください...私はあなたの説明をより慎重に読んだ後にそれを得たと思います。最初にObservableCollectionの新しい概念で私の周りを知りません、あなたの説明はすべて..新しいリストが作成され、そのリストはobservablecollectionではありません。とった! – user1205746

+0

私は今あなたの説明を理解しているようですが、何かがまだ私を悩ましています。元のMyListItemに変更が加えられた場合、getEvenのObservableCollectionは影響を受けないと私は理解しています。しかし、getEvenに通知し、getEvenでObservableCollectionに設定した変更をトリガーする方法はありますか?それはあなたに理にかなっていますか? – user1205746

関連する問題