1

私はこのような同じ問題を抱えています。しかし、私はListBoxの代わりにDataGridを使用しており、このようには機能しないようです(これは、Visual Basicを使用したことがなく、コードをc#に正しく変換しなかったためかもしれません)。基本的に、異なるフィルターを使用して同じデータに2つのDataGridが必要です。

    ICollectionView view_dataLinesUnfiltered;
    ICollectionView view_dataLinesFiltered;

 public MainWindow()
    {
        ...
        //view_dataLines = CollectionViewSource.GetDefaultView(dataLines); // <- Filter works on both
        view_dataLinesUnfiltered = new CollectionView(dataLines); // <- Filter doesn´t work at all
        view_dataLinesFiltered = new CollectionView(dataLines);
        ....
        // Control Events
        this.ShowAA.RaiseEvent(new RoutedEventArgs(System.Windows.Controls.Primitives.ToggleButton.UncheckedEvent));

    }

    private void ShowAA_Checked(object sender, RoutedEventArgs e)
    {
        view_dataLinesUnfiltered.Filter = null;
    }

    private void ShowAA_UnChecked(object sender, RoutedEventArgs e)
    {
        view_dataLinesUnfiltered.Filter = delegate(object o) { return FilterContent(o as ErrorDetection.stDataLine, "AA", ""); };
    }

    bool FilterContent(ErrorDetection.stDataLine line, string sFilterAA, string sFilter)
    {
        shortArrayToHexStringConverter converter = new shortArrayToHexStringConverter();

        string comBuffer = converter.Convert(line.ComBufferP as object,typeof(string),0,System.Globalization.CultureInfo.CurrentCulture) as string;

        return false;// !comBuffer.Contains("AA");
    }

FilterContentメソッドは問題なく呼び出されていますが、DataGridはとにかく行を表示します。GetDefaultViewを使用すると、フィルターは両方のデータグリッドで機能します。CollectionViewの代わりに他のビューを使用する必要がありますか(ListCollectionViewも機能しません)?

問題のサンプルを示すために、小さなサンプルプロジェクトを作成しました。コンストラクターと監視可能なコレクションのみで構成されます。

4

2 に答える 2

0

どのICollectionVIewをどのDataGridで使用するかを指定する必要があります。

コレクション(この場合はdataLines)にバインドするだけの場合、WPFは「デフォルトビュー」を使用します(または必要に応じて作成します)。これが、最初にコメント化された行がフィルタリングに機能する理由です。

使用しているパターンなどに応じて、どのビューをどのデータグリッドに使用するかを指定する方法はいくつかあります。

1)リンクされた質問のように、ビューを初期化した後、ウィンドウのコードビハインドで各DataGridのItemsSourceを設定できます。例:

filteredDataGrid.ItemsSource = view_dataLinesFiltered;
unfilteredDataGrid.ItemsSource = view_dataLinesUnfiltered;

2)ウィンドウのDataContextをそれ自体に設定するか、ビューを含む画面のビューモデルを作成し、ビューをパブリックプロパティにしてから、各グリッドの目的のビューにバインドすることができます。

<DataGrid ItemsSource="{Binding View_dataLinesFiltered}"> ....

編集:

今は仕事をしていないので、ドロップボックスにアクセスして例を試すことができます。奇妙な動作の原因は、CollectionViewを直接使用しているようです。CollectionViewのmsdnページには、

コード内にこのクラスのオブジェクトを作成しないでください。IEnumerableのみを実装するコレクションのコレクションビューを作成するには、CollectionViewSourceオブジェクトを作成し、コレクションをSourceプロパティに追加して、Viewプロパティからコレクションビューを取得します。

ただし、XAMLでビューを設定したくない場合は、CollectionViewsをListCollectionViewsに変更することもでき、期待どおりに機能するはずです(これは、CollectionViewSourceが舞台裏で作成しているビュータイプである可能性があります)。

于 2012-08-03T01:49:25.657 に答える
0

なんとか稼働させました。ICollectionView の代わりに CollectionViewSources を使用しました。

 <Window.Resources>
    <CollectionViewSource x:Key="viewSource_dataLinesUnfiltered"/>
    <CollectionViewSource x:Key="viewSource_dataLinesFiltered"/>
 </Window.Resources>
 ...
 <DataGrid Name="Filtered_Datagrid" ItemsSource="{Binding Source={StaticResource viewSource_dataLinesFiltered}}" >
  ...
 </DataGrid>
  ...
 <DataGrid Name="Unfiltered_Datagrid" ItemsSource="{Binding Source={StaticResource viewSource_dataLinesUnfiltered}}">
  ...
 </DataGrid>

およびcコード:

    CollectionViewSource viewSource_dataLinesUnfiltered;
    CollectionViewSource viewSource_dataLinesFiltered;
    ...
    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = dataLines;

        viewSource_dataLinesUnfiltered = (CollectionViewSource)this.Resources["viewSource_dataLinesUnfiltered"];
        viewSource_dataLinesUnfiltered.Source = dataLines;
        viewSource_dataLinesFiltered = (CollectionViewSource)this.Resources["viewSource_dataLinesFiltered"];
        viewSource_dataLinesFiltered.Source = dataLines;


        // Control Events
        this.ShowAA.RaiseEvent(new RoutedEventArgs(System.Windows.Controls.Primitives.ToggleButton.UncheckedEvent));

    }

    private void ShowAA_Checked(object sender, RoutedEventArgs e)
    {
        viewSource_dataLinesUnfiltered.View.Filter = null;
    }

    private void ShowAA_UnChecked(object sender, RoutedEventArgs e)
    {
        viewSource_dataLinesUnfiltered.View.Filter = delegate(object o) { return FilterContent(o as ErrorDetection.stDataLine, "AA", ""); };
    }

    bool FilterContent(ErrorDetection.stDataLine line, string sFilterAA, string sFilter)
    {
        shortArrayToHexStringConverter converter = new shortArrayToHexStringConverter();

        string comBuffer = converter.Convert(line.ComBufferP as object,typeof(string),0,System.Globalization.CultureInfo.CurrentCulture) as string;

        return !comBuffer.Contains("AA");
    }

しかし、なぜこのように機能するのか、ICollectionView が使用されている場合、ウィンドウの再描画にフィルターが適用されない理由がわかりません。

于 2012-08-03T03:41:29.260 に答える