複数のデータグリッドにバインドしたい ObservableCollection があり、それぞれが独自のウィンドウに表示され、各データグリッドには異なるフィルターがあります。私は最初にこれを使用していました:
ICollectionView m_icvs = CollectionViewSource.GetDefaultView(ListOrder)
m_icvs.Filter = OrderFilter;
そして、1 つのフィルターでは問題なく機能しましたが、それぞれ独自のフィルターを持つ複数のウィンドウを開く必要がある場合、フィルターはすべてのウィンドウで変更されます。これは、すべてのウィンドウが GetDefaultView によって返される同じ ICollectionView を使用しているためだと思います。そこで、同様の問題を抱えた別の投稿を見つけました - Multiple Views of Observable Collection with Datagrid。このソリューションを自分の問題に適応させようとしましたが、うまくいきませんでした。これは私が試したものです:
private CollectionViewSource m_cvs;
public CollectionViewSource Cvs
{
get { return m_cvs; }
set { m_cvs = value; }
}
ObservableCollection<OrderItem> m_listOrder;
public ObservableCollection<OrderItem> ListOrder
{
get { return m_listOrder; }
set { m_listOrder = value; }
}
public OrderDlg(ObservableCollection<OrderItem> listOrder)
{
ListOrder = listOrder;
...
Cvs = new CollectionViewSource();
Cvs.Source = ListOrder;
Cvs.View.Filter = delegate(object o) { return OrderFilter(o); };
}
xaml:
<DataGrid
ItemsSource="{Binding Cvs}">
...
</DataGrid>
このアプローチを使用すると、フィルターを適用する行をコメントアウトしても、DataGrid にデータが表示されません。