1

我有同样的问题。但是我使用的是 DataGrid 而不是 ListBox,它似乎不像这样工作(也可能是因为我从未使用过 Visual Basic 并且没有将代码正确地翻译成 C#)。我基本上想要两个具有不同过滤器的相同数据的 DataGrids。

    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

我让它以某种方式工作。我现在使用 CollectionViewSources 而不是 ICollectionView。

 <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 回答
0

您需要指定在哪个 DataGrid 上使用哪个 ICollectionVIew。

如果您只是绑定到集合(在这种情况下为 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 回答