WPF : 왜 DatacontextChanged가 논리적 인 어린이에게 제기되지 않습니까?

StackOverflow https://stackoverflow.com/questions/723655

  •  05-09-2019
  •  | 
  •  

문제

나는 문제가있다 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 );
    }

내가 이해 한 바와 같이, 이것은 작동하기 때문에 작동합니다 DataContext 이다 상속 가능한 종속성 속성.

이제 이벤트 처리기를 추가합니다 DataContextChanged 창 (this)과 논리적 인 아이 모두 :

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

내가 이것을 실행하면 첫 번째 이벤트 핸들러 만 실행됩니다. 왜 이런거야? AddLogicalChild (ELT) 대신 다음을 수행합니다.

this.Content = elt;

두 핸들러 모두 실행됩니다. 그러나 이것은 내 경우에는 옵션이 아닙니다. 저는 시각적 인 어린이가되어서는 안되는 제어에 프레임 워크 인터넷 립을 추가하고 있습니다.

여기서 무슨 일이야? addLogicalChild () 외에 무언가를 작동시키기 위해 더해야합니까?

(다행스럽게도 다소 간단한 해결 방법이 있습니다. 요소의 데이터 콘텍스트를 창의 데이터 컨텍스트에 바인딩합니다)

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

고맙습니다.

도움이 되었습니까?

해결책

당신은 그것을 무시해야합니다 LogicalChildren 속성도 :

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

물론, 기본 구현에 의해 정의 된 논리적 인 어린이들도 반환하고 싶을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top