Wpf ICollectionView过滤器会影响源
我在试验WPF时遇到了一些我没有预料到的过滤行为 我用ListView和DataGrid创建了一个简单的窗口控件,其中显示了有关美国总统的信息,如姓名、政党和数字顺序 应用程序实例化一个具有多个主席的ObservableCollection。主要是从ObservableCollection创建一个视图,并应用过滤和排序。ListView绑定到此视图,DataGrid绑定到原始ObservableCollection 我希望ListView显示过滤结果,DataGrid显示列表中的所有项目。但是,DataGrid也会显示过滤后的结果。有人对此有解释吗Wpf ICollectionView过滤器会影响源,wpf,data-binding,icollectionview,Wpf,Data Binding,Icollectionview,我在试验WPF时遇到了一些我没有预料到的过滤行为 我用ListView和DataGrid创建了一个简单的窗口控件,其中显示了有关美国总统的信息,如姓名、政党和数字顺序 应用程序实例化一个具有多个主席的ObservableCollection。主要是从ObservableCollection创建一个视图,并应用过滤和排序。ListView绑定到此视图,DataGrid绑定到原始ObservableCollection 我希望ListView显示过滤结果,DataGrid显示列表中的所有项目。但是,
public partial class MainWindow : Window
{
ICollectionView presidentView;
ObservableCollection<President> presidents = new ObservableCollection<President>
{
new President{Name = "Barack Obama", Party="Democratic", Order=44},
new President {Name = "George W Bush", Party="Republican", Order=43},
new President{Name = "Bill Clinton", Party="Democratic", Order=42},
new President {Name="George Bush", Party="Republican", Order=41},
new President{Name="Ronald Reagan", Party="Republican", Order=40},
new President{Name="Jimmy Carter", Party="Democratic", Order=39},
new President{Name="Gerald Ford", Party="Republican", Order=38},
new President{Name="Richard Nixon", Party="Republican", Order=37},
new President{Name="Lyndon Johnson", Party="Democratic", Order=36}
};
public MainWindow()
{
InitializeComponent();
presidentView = CollectionViewSource.GetDefaultView(presidents);
presidentView.SortDescriptions.Add(new SortDescription("Order", ListSortDirection.Ascending));
Predicate<object> isRepublican = (x) =>
{
President p = x as President;
return p.Party == "Republican";
};
presidentView.Filter = isRepublican;
list.ItemsSource = presidentView;
grid.ItemsSource = presidents;
}
}
public class President
{
public int Order { set; get; }
public string Name { set; get; }
public string Party { set; get; }
}
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication2"
Title="MainWindow" Height="350" Width="727.416">
<Grid>
<ListView HorizontalAlignment="Left" Height="260" Margin="10,10,0,0" Name="list" VerticalAlignment="Top" Width="197">
<ListView.ItemTemplate>
<ItemContainerTemplate>
<TextBlock Text="{Binding Path=Name}">
</TextBlock>
</ItemContainerTemplate>
</ListView.ItemTemplate>
</ListView>
<DataGrid Name="grid" HorizontalAlignment="Left" Margin="224,13,0,0" VerticalAlignment="Top" Height="257" Width="487"/>
</Grid>
</Window>
公共部分类主窗口:窗口
{
ICollectionView主席视图;
ObservableCollection presidents=新的ObservableCollection
{
新总统{Name=“巴拉克·奥巴马”,Party=“民主党”,Order=44},
新总统{Name=“乔治·W·布什”,Party=“共和党”,Order=43},
新总统{Name=“比尔·克林顿”,Party=“民主党”,Order=42},
新总统{Name=“乔治·布什”,Party=“共和党”,Order=41},
新总统{Name=“罗纳德·里根”,Party=“共和党”,Order=40},
新总统{Name=“吉米·卡特”,Party=“民主党”,Order=39},
新总统{Name=“杰拉尔德·福特”,Party=“共和党”,Order=38},
新总统{Name=“理查德·尼克松”,Party=“共和党”,Order=37},
新总统{Name=“林登·约翰逊”,Party=“民主党”,Order=36}
};
公共主窗口()
{
初始化组件();
presidentView=CollectionViewSource.GetDefaultView(总统);
添加(新的SortDescription(“Order”,ListSortDirection.升序));
谓词isRepublican=(x)=>
{
主席p=x为主席;
返回共和党=“共和党”;
};
presidentView.Filter=isRepublican;
list.ItemsSource=presidentView;
grid.ItemsSource=总裁;
}
}
公共课主席
{
公共整数顺序{set;get;}
公共字符串名称{set;get;}
公共字符串参与方{set;get;}
}
CollectionViewSource.GetDefaultView(object)
返回给定源的相同的ICollectionView
实例——在显示源集合(ICollectionView
)时,该实例将用于任何项控件(DataGrid
)
您可以通过创建一个新的ICollectionView
实例来解决这个问题,该实例将由您希望独立于其他控件的每个控件使用(通常,每个不同的过滤器使用不同的实例)
将您的presidentView
更新为如下示例:
public MainWindow()
{
InitializeComponent();
presidentView = new CollectionViewSource { Source= presidents }.View;
presidentView.SortDescriptions.Add(new SortDescription("Order", ListSortDirection.Ascending));
Predicate<object> isRepublican = (x) =>
{
President p = x as President;
return p.Party == "Republican";
};
presidentView.Filter = isRepublican;
list.ItemsSource = presidentView;
grid.ItemsSource = presidents;
}
public主窗口()
{
初始化组件();
presidentView=new CollectionViewSource{Source=presidents}.View;
添加(新的SortDescription(“Order”,ListSortDirection.升序));
谓词isRepublican=(x)=>
{
主席p=x为主席;
返回共和党=“共和党”;
};
presidentView.Filter=isRepublican;
list.ItemsSource=presidentView;
grid.ItemsSource=总裁;
}
CollectionViewSource.GetDefaultView(object)
返回给定源的相同的ICollectionView
实例——在显示源集合(ICollectionView
)时,该实例将用于任何项控件(DataGrid
)
您可以通过创建一个新的ICollectionView
实例来解决这个问题,该实例将由您希望独立于其他控件的每个控件使用(通常,每个不同的过滤器使用不同的实例)
将您的presidentView
更新为如下示例:
public MainWindow()
{
InitializeComponent();
presidentView = new CollectionViewSource { Source= presidents }.View;
presidentView.SortDescriptions.Add(new SortDescription("Order", ListSortDirection.Ascending));
Predicate<object> isRepublican = (x) =>
{
President p = x as President;
return p.Party == "Republican";
};
presidentView.Filter = isRepublican;
list.ItemsSource = presidentView;
grid.ItemsSource = presidents;
}
public主窗口()
{
初始化组件();
presidentView=new CollectionViewSource{Source=presidents}.View;
添加(新的SortDescription(“Order”,ListSortDirection.升序));
谓词isRepublican=(x)=>
{
主席p=x为主席;
返回共和党=“共和党”;
};
presidentView.Filter=isRepublican;
list.ItemsSource=presidentView;
grid.ItemsSource=总裁;
}