41

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();
    }

何か案が ?

4

4 に答える 4

83

これ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の使用を拒否することはあまり良い考えではありません

于 2011-08-14T19:20:55.273 に答える
18

私はまた、ちょうどやっていることがわかりました

dgOrderDetails.Items.Refresh();

も同じ動作を実現します。

于 2013-05-17T16:55:30.037 に答える
2

ItemSource をフィルタリングされたリストにバインドすると、たとえば Lambda は更新されません。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;
于 2016-12-15T10:56:44.840 に答える