2016-11-08 26 views
1

XAMLにアイテムのリストを表示しようとしています。私は公開APIからリストを取得し、必要なクラスに変換してから表示したい。ObservableCollectionがUIに表示されない

public static async Task PopulateListAsync(ObservableCollection<MyClass> myList) { 
    var listContainer = await GetListAsync(); 

    foreach (var item in listContainer) { 
     //converting from one class to another, editing some properties and such 
     myList.Add(item); 
    } 
} 

と私は

public ObservableCollection<MyClass> Value { get; set; } 

public MainPage() { 
    this.InitializeComponent(); 
    Value = new ObservableCollection<MyClass>(); 
} 

private async void Page_Loaded(object sender, RoutedEventArgs e) { 
    await PopulateListAsync(Value); 
} 

を持っていた私は、XAMLの罰金に表示MainPage.csに。

しかし、私はフィルタリングを導入したかったのです。だから私は、データを取得し、それらをいくつかのクラスに変換してリストに挿入し、LINQでフィルタリングします(ObservableCollectionでフィルタリングする方が簡単です)。

PopulateListAsync()は、基本的にに直接データを挿入する代わりにFormatListAsync()に置き換え、List<>を返します。それから私は、私はおそらくループトラフmylist可能性があり、それをObservableCollection<>に一つずつ追加し、しかし確実に、より良い方法があるように私は感じ

public static async Task PopulateListAsync(ObservableCollection<MyClass> myList) { 
    myList = new ObservableCollection<MyClass>(await FormatListAsync()); 
    //filtering itself isn't implemented yet, but it would be placed here 
} 

「仲介者」の機能を持っています。

PropertyChangedイベントなどを実装するはずですが、いくつか試みましたが(例:this one)、失敗しました。私はそれを実装する方法をかなり理解しているとは思わない。

+0

私はあなたができるとは思わない値=新しいObservableCollection (); Valueプロパティはstring型であるためです。おそらくタイプミス? –

+0

ちょうどタイプミス。ごめんなさい。 – rancor1223

+0

ObservableCollectionのOnPropertyChangeがありません – Master

答えて

1

メソッドのパラメータに新しい値を割り当てる場合は、参照のコピーをコレクションに変更してソース参照を変更しないでください。 passing reference types as method parameters on MSDNについて詳しく読むことができます。

また、INotifyPropertyChanged自体を実装していないプロパティを変更すると、変更内容が表示されないため、UIに変更はありません。

新しいコレクションを作成するのではなく、簡単かつ簡単にソースコレクションを操作できます。ただ、

public static async Task PopulateListAsync(ObservableCollection<MyClass> myList) 
{ 
    // newList can be an List<MyClass> type, not ObservableCollection 
    var newList = await FormatListAsync(); 

    // change displayed list with new data 
    myList.Clear(); 
    foreach(var newValue in newList) 
     myList.Add(newValue); 
} 

他のオプションのようなものは、あなたがあなたのViewModelのためINotifyPropertyChangedを実装し、ValueプロパティのセッターでPropertyChangedイベントを発生させることができません。また

private ObservableCollection<MyClass> _value; 
public ObservableCollection<MyClass> Value 
{ 
    get 
    { 
     return _value; 
    } 
    set 
    { 
     // I hope this line of code will convince you to give more clear variable name 
     if(value != _value) 
     { 
      _value = value; 
      NotifyPropertyChanged(nameof(Value)); 
     } 
    } 
} 

、あなたは直接Valueを割り当てる必要がありますPopulateListAsync()

public static async Task PopulateListAsync() 
{ 
    Value = new ObservableCollection<MyClass>(await FormatListAsync()); 
} 
+0

私は物事を行う最初の方法ですが、私はもっ​​と良い方法があるのだろうかと思っていた。 'NotifyPropertyChanged'について - 私はMVVMパターンを使わずに実装できますか?これはC#の私の最初の適切なプロジェクトです。正直なところMVVMをあきらめましたが、私はそれを動作させることができませんでした。 – rancor1223

+0

@ rancor1223まあ、MVVMは良い方法です:)また、リスト全体を変更する場合は、プロパティに 'List 'のタイプがある場合は、ObservableCollectionを使用する必要はありません。コレクションを動的に操作する場合は、ObservableCollectionを使用します(クリア、追加、その他のメソッドを使用)。 あなたのオブジェクトのINPCを実装することはできますが、クラスは分離されていませんが、ビューのデータソースです。 また、コントロールとそのプロパティを直接操作することには本当に悪い方法があります。 'ObservableCollection data = new ObservableCollection (...); ListBox.ItemsSource = data; ' –

+0

私はMVVMに次回のショットを与えます。今は私にとってはあまりにも多くのことです:)。 'ObservableCollection <>'は、必要に応じて後でそれを使い果たすためのスペースを与えてくれたとは思うが、私は 'List <>'だけを使うことになるだろう。助けてくれてありがとう! – rancor1223

関連する問題