2

次のように一般化できる WPF の問題に取り組んでいます。

  1. 2 つの ListView を持つ

    <ListView x:Name="listView1"></ListView>
    <ListView x:Name="listView2"></ListView>
    
  2. コードビハインドでは、それらのフィルターが作成されます。

    var listViewCollection1 = (ListCollectionView)CollectionViewSource.GetDefaultView(Items);
    listViewCollection1.Filter = item => (item as string).Length == 5;
    listView1.ItemsSource = listViewCollection1;
    
    var listViewCollection2 = (ListCollectionView)CollectionViewSource.GetDefaultView(Items);
    listViewCollection2.Filter = item => (item as string).Length == 3;
    listView2.ItemsSource = listViewCollection2;
    
    public ObservableCollection<string> items = new ObservableCollection<string>()
                                                    {
                                                        "John",
                                                        "Jan",
                                                        "Lanny",
                                                        "Carol",
                                                        "Hug",
                                                    };
    
    public ObservableCollection<string> Items
    {
        get
        {
            return items;
        }
        private set
        {
            items = value;
        }
    }
    
  3. 2 番目のフィルターは最初のフィルターをオーバーライドし、次の項目が両方の listView に表示されます。

    • 1月
    • 抱擁
  4. 誰が私に教えてくれますか、何が問題なのですか? 2 つの異なるフィルターを持つ 1 つのデータ ソースにバインドされた 2 つの listView を適切にインスタンス化するにはどうすればよいですか?

助けていただければ幸いです。

4

2 に答える 2

3

両方ListViewの は基本的に同じコレクションの同じビューにバインドされます。フィルターを一度設定してからオーバーライドします。

オブジェクトへの参照を取得するときは、そのコピーを作成するのではなく、参照することを忘れないでください。その参照の名前が異なるからといって、それが異なるわけではありません。

これは、デバッガーを実行して 2 番目のフィルターを中断することで確認できます。行が実行される前に、フィルターが長さ 5 のラムダ フィルター処理に設定され、それを長さ 3 に変更していることに注意してください。 .

目的を達成するには、元のリストに設定してCollectionViewSource別のを作成する必要があります。Source

var listViewCollection1 = (ListCollectionView)CollectionViewSource.GetDefaultView(Items);
listViewCollection1.Filter = item => (item as string).Length == 5;
listView1.ItemsSource = listViewCollection1;

var newView = new CollectionViewSource() { Source = Items };
var listViewCollection2 = (ListCollectionView)newView.View; // Here the View must be used
listViewCollection2.Filter = item => (item as string).Length == 3;
listView2.ItemsSource = listViewCollection2;

(注:テストされていませんが、原則は正しいはずです)

于 2013-01-19T22:08:46.157 に答える
0

それらは同じビュー オブジェクトを参照しています。MSDN

于 2013-01-19T22:08:35.567 に答える