6

WPF UserControl のコンストラクターにいくつかのコードがあります。基本的に、XmlDataProvider へのバインディングを設定します (私のデータは動的です)。次に、ビューの CustomSort を MySorter (IComparer を実装) に設定します。

問題は、GetDefaultView が SetBinding 呼び出しの直後に呼び出された場合に null を返すことです。あたかも ItemsSource をセットアップするために何らかの非同期処理が行われているようです。同じ GetDefaultView コードを後でボタン Click ハンドラーで呼び出すと、正常に動作し、null が返されず、並べ替えメカニズムがすべて正常に動作することに注意してください。

MyListBox.SetBinding(ListBox.ItemsSourceProperty, binding);

ListCollectionView view = CollectionViewSource.GetDefaultView(MyListBox.ItemsSource) as ListCollectionView;

view.CustomSort = new MySorter(); // falls over - view is null

私の質問は、GetDefaultView が SetBinding の直後に呼び出されたときに null を返すのはなぜですか? GetDefaultView を呼び出して null 以外の応答を取得する前に待機する必要があるイベントはありますか?

4

2 に答える 2

3

あなたUsers.ItemsSourceItemCollectionItemCollectionから継承しているので、おそらくビューもそうでしょうCollectionView

CollectionViewSource.GetDefaultViewを返しますICollectionViewCollectionViewそれからListCollectionViewのみ継承するクラスが他にもあります。キャストが失敗しないことを確認してください。たとえば、次のコードを使用します。

var view = CollectionViewSource.GetDefaultView(Users.ItemsSource);
Console.WriteLine(view.GetType());
于 2012-07-27T16:37:05.780 に答える
0

これは、XmlDataProvider が使用されている場合に発生します。DataContext がコードのオブジェクト インスタンスから設定されている場合、GetDefaultView は null を返しません。ただし、XmlDataProvider を使用すると、GetDefaultView は null を返します。これは、xml が読み込まれるまで null が返されるためです。

そのため、「Loaded」イベントのイベント ハンドラー メソッドから CollectionViewSource.GetDefaultView を呼び出すと、正常に動作します。

public MainWindow()
    {
        InitializeComponent();
        this.comboBox1.Loaded += new RoutedEventHandler(ComboBoxLoaded);           
    }

    private void ComboBoxLoaded(object sender, RoutedEventArgs e)
    {
        ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(((XmlDataProvider)this.myGrid.DataContext).Data);
        view.SortDescriptions.Add(new SortDescription("Location", ListSortDirection.Ascending));
    }    

この例は、次のリンク (ステージ 8 の下) で見つけることができます。

http://wpfgrid.blogspot.com/2013/01/simple-combobox-implementation.html

于 2013-01-10T16:07:26.927 に答える