3

Dim All_PriceLists As System.Collections.ObjectModel.ObservableCollection(Of BSPLib.PriceLists.PriceListPrime)whereを使用して、その PriceListPrime中のすべてのプロパティにInotifyを実装しています。

All_PriceListをデータグリッドにバインドしましたDataGrid1.ItemsSource = All_PriceListsAll_PriceLists=Getall()、GetallがDBからデータを読み取って取得する場合、データグリッドは更新されません。

この方法でハックした場合にのみ更新されます。

DataGrid1.ItemsSource = Nothing
DataGrid1.ItemsSource = All_PriceLists

どこが間違っているのか、何を実装すべきなのか教えてください。ありがとうございました。

4

3 に答える 3

4

あなたはあなたの問題に対するいくつかの解決策を持っています

  • ItemsSourceを直接更新します(ローカルメンバー変数を置き換えるのではなく)

    DataGrid1.ItemsSource = new ObservableCollection(Of PriceListPrime)(GetAll())
    
  • ObservableCollectionを更新します(別の回答で言及されているように)

    All_PriceList.Clear(); 
    For Each item in Getall() 
        All_PriceList.Add(item) 
    Next 
    
  • DataContextをビューモデルに設定し、ビューモデルのプロパティにバインドします

    Dim vm as new MyViewModel()
    DataContext = vm
    vm.Items = new ObservableCollection(Of PriceListPrime)(GetAll())        
    

    ビューモデルはINotifyPropertyChangedを実装し、Itemsプロパティが変更されたときにPropertyChangedイベントを発生させます。Xamlでは、DataGridがプロパティItemsSourceにバインドされItemsます。

于 2012-05-06T17:20:16.183 に答える
2

アプリが変更に反応するようにする場合は、新しいものを作成するのではなく、ObservableCollectionを更新する必要があります。

したがって、All_PriceListコレクションをクリアして、新しいアイテムを追加します。例:

All_PriceList.Clear();
For Each item in Getall()
  All_PriceList.Add(item)
Next

ObservableCollectionはAddRangeをサポートしていないため、アイテムを1つずつ追加するかINotifyCollectionChanged、独自のコレクションに実装する必要があります。

于 2012-05-06T16:59:29.630 に答える
2

問題は、コレクションを更新しておらず、コレクションを置き換えていることです。これは異なります。データグリッドは古いリストにバインドされたままになり、更新されたデータは新しいバインドされていないコレクションに保存されます。つまり、ソリューションをハッキングしているのではなく、データグリッドを新しいコレクションにバインドしているのです。これは正しいことです。

より自動化されたソリューションが必要な場合は、データグリッドをデータセット/データテーブルにバインドする必要があります。これはまったく異なるコードです。

于 2012-05-06T16:33:34.770 に答える