2009-04-06 8 views
2

DataContextChangedに問題があり、カスタムPanelコントロールの論理的な子で発生していません。私はこれにそれを絞り込むました:WPF:論理子でDataContextChangedが発生しないのはなぜですか?

は、私が追加ウィザードで生成されたWPFアプリケーション最低料金:私は理解したよう

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     var elt = new FrameworkElement(); 
     this.AddLogicalChild(elt); 
     DataContext = 42; 
     Debug.Assert((int)elt.DataContext == 42); 
    } 

のDataContextinheritable dependency propertyあるので、これは動作します。

今、私はウィンドウ(本)とその論理的な子のDataContextChanged両方のイベントハンドラを追加します。

this.DataContextChanged += 
     delegate { Debug.WriteLine("this:DataContextChanged"); }; 
    elt.DataContextChanged += 
     delegate { Debug.WriteLine("elt:DataContextChanged"); }; 

私はこれを実行すると、のみ最初のイベントハンドラが実行されます。 これはなぜですか?そうではなくAddLogicalChild指定の(ELT)私は、次の手順を実行します

this.Content = elt; 

両方のハンドラが実行されます。しかし、これは私の場合の選択肢ではありません - 私は視覚的な子供であるはずではない私のコントロールにFrameworkContentElementsを追加しています。

ここでは何が起こっていますか? AddLogicalChild()のほかに何かをして、動作させるべきでしょうか?

(幸いなことに、むしろ簡単な回避策がある - ちょうど窓ののDataContextに要素のDataContextのバインド)

BindingOperations.SetBinding(elt, FrameworkElement.DataContextProperty, 
      new Binding("DataContext") { Source = this }); 

ありがとうございました。あなたもLogicalChildrenプロパティをオーバーライドする必要が

答えて

5

:もちろん

protected override System.Collections.IEnumerator LogicalChildren 
{ 
    get { yield return elt; } 
} 

は、あなたも、基本実装によって定義された任意の論理子供を返すようにしたいでしょう。

+0

はい、それです!ありがとう、ケント! –

関連する問題