1

複数のデータグリッドにバインドしたい 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 にデータが表示されません。

4

1 に答える 1

0

DataGrid の itemsource は、 CollectionViewSource ではなくICollectionViewにバインドする必要があります。

ICollectionViewオブジェクトから返されるプロパティを作成しCollectionViewSourceます -

public ICollectionView CV
{
   get
   {
      return m_cvs.View;
   }
}

XAML でバインディングを更新します -

<DataGrid ItemsSource="{Binding CV}"/>
于 2013-11-04T21:40:21.663 に答える