Wpf ICollectionView过滤器会影响源

Wpf ICollectionView过滤器会影响源,wpf,data-binding,icollectionview,Wpf,Data Binding,Icollectionview,我在试验WPF时遇到了一些我没有预料到的过滤行为 我用ListView和DataGrid创建了一个简单的窗口控件,其中显示了有关美国总统的信息,如姓名、政党和数字顺序 应用程序实例化一个具有多个主席的ObservableCollection。主要是从ObservableCollection创建一个视图,并应用过滤和排序。ListView绑定到此视图,DataGrid绑定到原始ObservableCollection 我希望ListView显示过滤结果,DataGrid显示列表中的所有项目。但是,

我在试验WPF时遇到了一些我没有预料到的过滤行为

我用ListView和DataGrid创建了一个简单的窗口控件,其中显示了有关美国总统的信息,如姓名、政党和数字顺序

应用程序实例化一个具有多个主席的ObservableCollection。主要是从ObservableCollection创建一个视图,并应用过滤和排序。ListView绑定到此视图,DataGrid绑定到原始ObservableCollection

我希望ListView显示过滤结果,DataGrid显示列表中的所有项目。但是,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=总裁;
}