C# 使用Datagrid的可观察集合的多视图
我也有类似的问题。但是我使用的是DataGrid而不是ListBox,它似乎不是这样工作的,这也可能是因为我从未使用过visual basic,也没有正确地将代码翻译成c。 我基本上希望在相同的数据上使用不同的过滤器设置两个数据网格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() { ...
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");
}