web-dev-qa-db-ja.com

ItemsSourceが変更されたときにDataGridが更新されないのはなぜですか?

Wpfアプリケーションにデータグリッドがあり、簡単な問題があります。ジェネリックリストがあり、オブジェクトがコレクションに追加されるたびに、このコレクションをデータグリッドデータソースにバインドします。オブザーバブルコレクションを使用することに興味はありません。

重要なのは、他のどこかで同じ方法を使用していて、それがうまくいくということです。しかし、今回は[追加]ボタンを押すとオブジェクトが追加され、データグリッドは正しく更新されますが、コレクションに追加された2番目のアイテムからデータグリッドは更新されません。

コードは次のとおりです。

 private void btnAddItem_Click(object sender, RoutedEventArgs e)
    {
        OrderDetailObjects.Add(new OrderDetailObject
        {
            Price = currentitem.Price.Value,
            Quantity = int.Parse(txtQuantity.Text),
            Title = currentitem.DisplayName,
            TotalPrice = currentitem.Price.Value * int.Parse(txtQuantity.Text)
        });

        dgOrderDetail.ItemsSource = OrderDetailObjects;
        dgOrderDetail.UpdateLayout();
    }

何か案が ?

31
Pouyan

ItemsSourceは常に同じであり、コレクションへの参照、変更なし、更新なしです。前にそれを無効にすることができます:

dgOrderDetail.ItemsSource = null;
dgOrderDetail.ItemsSource = OrderDetailObjects;

または、アイテムを更新することもできます。

dgOrderDetail.ItemsSource = OrderDetailObjects; //Preferably do this somewhere else, not in the add method.
dgOrderDetail.Items.Refresh();

UpdateLayoutを実際に呼び出したいとは思わない...

ObservableCollectionの使用を拒否するのはあまり良い考えではありません

64
H.B.

私もやっていることがわかりました

dgOrderDetails.Items.Refresh();

同じ動作を実現します。

14
Matt

たとえば、Lambdaを使用してItemSsourceをフィルターされたリストにバインドすると、更新されません。 ICollectionViewを使用してこの問題を解決します(コメントは機能しません)。

//WindowMain.tvTemplateSolutions.ItemsSource = this.Context.Solutions.Local.Where(obj=>obj.IsTemplate); // templates
ICollectionView viewTemplateSolution = CollectionViewSource.GetDefaultView(this.Context.Solutions.Local);
viewTemplateSolution.SortDescriptions.Clear();
viewTemplateSolution.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
viewTemplateSolution.Filter = obj =>
{
   Solution solution = (Solution) obj;
   return solution.IsTemplate;
};
WindowMain.tvTemplateSolutions.ItemsSource = viewTemplateSolution;
1
Suplanus

observableCollectionをアイテムコレクションとして使用し、ビューモデルでCollectionViewSource.GetDefaultView(my_collection).Refresh()を呼び出します。

0
user742808