2013-04-29 2 views
0

Я экспериментировал с WPF и столкнулся с некоторым поведением фильтрации, которого я не ожидал.Фильтр ICollectionView влияет на источник

Я создал простой элемент управления Window с ListView и DataGrid, который отображает информацию о президентах США, таких как имя, сторона и порядковый номер.

Приложение создает экземпляр ObservableCollection несколькими президентами. В Main создается представление из 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> 

ответ

2

CollectionViewSource.GetDefaultView(object) возвращает тот же экземпляр ICollectionView для данного источника - который будет использоваться для любого ItemsControlDataGrid) при отображении исходной коллекции (presidents).

Вы можете обойти это, создав новый экземпляр 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

Смежные вопросы