2012-07-27 14 views
5

をSetBinding後にヌル。基本的に私はXmlDataProviderへのバインディングを設定しました(私のデータは動的です)。次に、ビューのCustomSortをMySorter(IComparerを実装する)に設定します。 ItemsSourceを設定するために起こっているいくつかの非同期処理があるかのように -CollectionViewSource.GetDefaultView戻っは、私はWPFユーザーコントロールのコンストラクタでのいくつかのコードを持っているだけで

問題はSetBindingコールの直後に呼び出された場合GetDefaultViewがnullを返すということです。私が同じGetDefaultViewコードを後でボタンクリックハンドラで呼び出すと、それはうまく動作し、nullを返さず、ソートメカニズムはすべてうまく動作していることに注意してください。私の質問は、なぜ直接SetBinding後GetDefaultViewリターンヌルと呼ばれるん

MyListBox.SetBinding(ListBox.ItemsSourceProperty, binding); 

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

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

、私はGetDefaultView呼び出す前に待つとnull以外の応答を取得する必要がある場合はありますか?

+1

このコードがどこにあるかを知るために役立つかもしれませんか?おそらく、この時点でバインディング自体は「null」です。 – user7116

+2

元の投稿に誤字がありました(修正済み)、申し訳ありません。 GetDefaultViewのUsers.ItemsSourceは、実際には、最初の行にバインドセットを持つMyListBoxと同じです。したがって、MyListBox.ItemsSourceがnullでない必要がある理由 – user1558012

答えて

3

はあなたのUsers.ItemsSourceItemCollectionですか?それからCollectionViewを継承しているので、おそらくビューはItemCollectionになるでしょう。

CollectionViewSource.GetDefaultViewICollectionView返します。 CollectionViewから継承するクラスがさらにあり、ListCollectionViewのみです。あなたのキャストが失敗しないことを確認してください。

var view = CollectionViewSource.GetDefaultView(Users.ItemsSource); 
Console.WriteLine(view.GetType()); 
+1

元の投稿に誤字を入れました(修正済み)、申し訳ありません。 GetDefaultViewのUsers.ItemsSourceは、実際には、最初の行にバインドセットを持つMyListBoxと同じです。したがって、MyListBox.ItemsSourceがnullでない必要がある理由後のClickイベントハンドラで呼び出されたときにキャストが失敗しないので、キャストの問題ではないと思います。ありがとう。 – user1558012

+0

私のコードは何ですか(訂正​​あり)? MyListBox.ItemsSourceがNullであり、CollectionViewSource.GetDefaultView(MyListBox.ItemsSource)がNullの場合は、この順序でチェックします。それはSetBinding呼び出しから戻ったとき、それが結合終わっていなかったかのように - – LPL

+0

MyListBox.ItemsSourceがnullである...しかし、それだけで後ボタンをクリックハンドラ内でnullでありませんか? XmlDataProviderにはかなりの量のデータがありますが、まだ1秒未満でデータが取り込まれます。 – user1558012

0

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

したがって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

+0

「CollectionViewSource.GetDefaultView」が「null」を返すが、なぜそれを理解できなかったかは、ランダムな場合があります。私はこれが答えだと思います。 – karmasponge

関連する問題