2013-04-29 65 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