2013-04-29 77 views
0

我正在试验WPF并遇到了一些我没有想到的过滤行为。ICollectionView过滤器影响源

我使用ListView和DataGrid创建了一个简单的Window控件,该控件显示有关美国总统的信息,例如姓名,派对和数字顺序。

应用程序实例化与几个总统ObservableCollection。在Main中,从ObservableCollection创建视图,并应用筛选和排序。 ListView绑定到此视图,并且DataGrid绑定到原始的ObservableCollection。

我期望ListView显示过滤结果和DataGrid以显示列表中的所有项目。但是,DataGrid也显示过滤结果。有没有人对此有过解释?显示的源集合(presidents)时,这将被用于任何ItemsControl(所述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> 

回答

2

CollectionViewSource.GetDefaultView(object)返回相同ICollectionView实例为给定的源。

你可以通过创建一个新的实例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; 
} 
+1

它的工作就像一个众所周知的魅力。谢谢。 – akmartzke 2013-04-29 19:49:06