0

WPF を試していたところ、予期しないフィルタリング動作に遭遇しました。

ListView と DataGrid を使用して単純な Window コントロールを作成しました。これにより、名前、政党、番号順など、米国大統領に関する情報が表示されます。

アプリケーションは、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>
4

1 に答える 1

4

CollectionViewSource.GetDefaultView(object)は、指定されたソースに対して同じインスタンスを返します。これは、ソース コレクション ( ) を表示するときICollectionViewに任意ItemsControlの ( ) に使用されます。DataGridpresidents

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;
}
于 2013-04-29T19:21:44.673 に答える