Datagrid可观察集合的多视图

Datagrid可观察集合的多视图

问题描述:

我有和this一样的问题。但我使用DataGrid而不是ListBox,它似乎不像这样工作(这也可能是因为我从来没有使用Visual Basic,也没有将代码正确地转换为C#)。 我基本上想要两个DataGrids在不同的过滤器相同的数据。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,则Filter将在两个Datagrids上工作。我是否必须使用其他视图而不是CollectionView(ListCollectionView也不起作用)?

我做了一个小样本项目,以显示问题sample。它只包含一个构造函数和一个可观察的集合。

+0

你是如何绑定或设置你的DataGrid上的ItemsSource? – 2012-08-02 22:58:12

+0

即时设置this.DataContext = dataLines;在MainWindow构造函数中。然后ItemsSource =“{Binding}”在Xaml中的DataGrids – user1550097 2012-08-02 23:55:27

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

如果您只是绑定到集合(在这种情况下为dataLines),WPF将使用“默认视图”(或者如果需要创建一个),这就是为什么第一条注释掉的行适用于过滤。

有,你可以指定哪些视图用于该数据网格的几种方法,取决于什么图案等您使用

1)像链接的问题,你可以设置的ItemsSource为每个数据网格中窗口的后台代码,初始化的意见后,如:

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

2)你可以在窗口的DataContext设置为自己,或作出对包含该视图的屏幕视图模型,并进行意见公开属性,然后绑定到每个网格的预期视图,例如

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

编辑:

现在我不是在工作和可以得到的保管箱,并与你的榜样好像怪异行为的原因是直接使用的CollectionView的发挥。在msdn page for CollectionView它说

你不应该在你的代码中创建这个类的对象。要为仅实现IEnumerable的集合创建 集合视图,请创建CollectionViewSource对象,将集合添加到 Source属性,然后从View属性中获取集合视图。

但是,如果你不想成立于XAML的意见,你也可以改变你的CollectionViews到ListCollectionViews,它应该按预期工作(这很可能是CollectionViewSource正在为你身后的视图类型无论如何,场景)。

+0

谢谢,它现在部分工作,但如果我调整窗口的大小,应该过滤的行再次显示。我是否需要处理一些事件并在那里调用Filter事件?使用默认视图调整大小的作品。 – user1550097 2012-08-03 02:19:40

+0

Filter semms仅适用于添加的行。如果窗口绘制新的已经存在的行不会被过滤 – user1550097 2012-08-03 02:33:15

我以某种方式工作。我现在使用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当过滤器不应用于窗口重新绘制。