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();
}
何か案が ?
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の使用を拒否するのはあまり良い考えではありません)
私もやっていることがわかりました
dgOrderDetails.Items.Refresh();
同じ動作を実現します。
たとえば、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;
observableCollectionをアイテムコレクションとして使用し、ビューモデルでCollectionViewSource.GetDefaultView(my_collection).Refresh()を呼び出します。