C# 使用Datagrid的可观察集合的多视图

C# 使用Datagrid的可观察集合的多视图,c#,wpf,datagrid,filter,observablecollection,C#,Wpf,Datagrid,Filter,Observablecollection,我也有类似的问题。但是我使用的是DataGrid而不是ListBox,它似乎不是这样工作的,这也可能是因为我从未使用过visual basic,也没有正确地将代码翻译成c。 我基本上希望在相同的数据上使用不同的过滤器设置两个数据网格 ICollectionView view_dataLinesUnfiltered; ICollectionView view_dataLinesFiltered; public MainWindow() { ...

我也有类似的问题。但是我使用的是DataGrid而不是ListBox,它似乎不是这样工作的,这也可能是因为我从未使用过visual basic,也没有正确地将代码翻译成c。 我基本上希望在相同的数据上使用不同的过滤器设置两个数据网格

    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列表CollectionView也不工作


我做了一个小样本项目来说明这个问题。它只包含一个构造函数和一个可观察的集合。

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

如果您只是绑定到集合数据行,在这种情况下,WPF将使用“默认视图”或在必要时创建一个,这就是为什么第一个注释掉的行用于过滤

有几种方法可以指定哪个视图用于哪个datagrid,具体取决于您使用的模式等

1与链接问题一样,您可以在初始化视图后,在窗口的代码中为每个DataGrid设置ItemsSource,例如:

filteredDataGrid.ItemsSource = view_dataLinesFiltered;
unfilteredDataGrid.ItemsSource = view_dataLinesUnfiltered;
2您可以将窗口的DataContext设置为自身,或者为包含视图的屏幕创建视图模型,并将视图设置为公共属性,然后绑定到每个网格的预期视图,例如

<DataGrid ItemsSource="{Binding View_dataLinesFiltered}"> ....
编辑:

现在我不在工作,可以去dropbox玩你的例子了,看起来奇怪行为的原因是直接使用CollectionView。上面写着

您不应该在代码中创建此类的对象。创建 仅实现IEnumerable的集合的集合视图, 创建CollectionViewSource对象,将您的集合添加到 属性,并从view属性获取集合视图


但是,如果您不想在XAML中设置视图,您也可以将CollectionView更改为,它应该可以按预期工作这很可能是CollectionViewSource在幕后为您创建的视图类型。

我设法使其工作。我现在使用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>

但是我不知道为什么它是这样工作的,并且当使用ICollectionView时,过滤器不会应用于窗口重新绘制。

您如何在数据网格上绑定或设置ItemsSource?im设置this.DataContext=dataLines;在主窗口构造函数中。然后ItemsSource={Binding}在XamlThank中的DataGrids上,它现在部分工作,但是如果我调整窗口大小,应该过滤的行将再次显示。我是否需要处理一些事件并在那里调用筛选器事件?在默认视图中,调整大小是有效的。过滤器将只应用于添加的行。如果窗口绘制新的行,则不会过滤已经存在的行
    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");
    }