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。它只包含一个构造函数和一个可观察的集合。
您需要指定在哪个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正在为你身后的视图类型无论如何,场景)。
谢谢,它现在部分工作,但如果我调整窗口的大小,应该过滤的行再次显示。我是否需要处理一些事件并在那里调用Filter事件?使用默认视图调整大小的作品。 – user1550097 2012-08-03 02:19:40
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当过滤器不应用于窗口重新绘制。
你是如何绑定或设置你的DataGrid上的ItemsSource? – 2012-08-02 22:58:12
即时设置this.DataContext = dataLines;在MainWindow构造函数中。然后ItemsSource =“{Binding}”在Xaml中的DataGrids – user1550097 2012-08-02 23:55:27