2013-04-29 3 views
0

WPF를 실험하고 예상치 못한 일부 필터링 동작이 발생했습니다. ICollectionView 필터가 소스에 영향을줍니다.

나는 이름, 자, 그리고 숫자 순서와 미국 대통령,에 대한 정보를 표시 ListView를 및 데이터 그리드, 간단한 윈도우 제어를 만들었습니다.

응용 프로그램은 여러 대통령과 ObservableCollection에를 인스턴스화합니다. Main에서는 ObservableCollection에서 뷰를 만들고 필터링 및 정렬을 적용합니다. ListView는이 뷰에 바인딩되고 DataGrid는 원래 ObservableCollection에 바인딩됩니다.

나는 필터링 결과 및 목록의 모든 항목을 표시하는 데이터 그리드를 표시 목록보기 예상했다. 그러나 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

관련 문제