2009-10-14 8 views
4

DependencyProperty가있는 UserControl이 있습니다. 데이터 바인딩 표현식을 사용하여 호스트 윈도우에서 값을 설정합니다. 그러나 예상대로 작동하지 않습니다. 사용자 컨트롤의 코드 숨김에서Databind를 사용할 수 없습니다. DependencyProperty

발췌문 : 아무것도 어떻게됩니까

<CasingEditor:CasingListView x:Name="_casingListView" 
          ViewModel="{Binding CasingListViewModel}" /> 

:

public class ViewBase : UserControl 
{ 
    public static readonly DependencyProperty ViewModelProperty 
     = DependencyProperty.Register(
      "ViewModel", typeof(ViewModelBase), typeof(ViewBase)); 

    public ViewModelBase ViewModel 
    { 
     get { return GetValue(ViewModelProperty) as ViewModelBase; } 
     set 
     { 
      SetValue(ViewModelProperty, value); 
     } 
    } 
} 

그리고 XAML (: CasingListView이 ViewBase에서 상속 주)에서

. 특히 setter는 호출되지 않으며 속성은 null로 유지됩니다. 다른 속성 (DataContext)에 바인딩하려고했기 때문에 소스 속성 CasingListViewModel에 값이 있다는 것을 알았습니다. 제대로 작동했습니다.

종속성 속성이 데이터 바인딩 될 수 있다고 생각했습니다. 내가 잘못?

+1

관심 없어, 왜 DataContext에 바인딩하지? –

+0

좋은 질문입니다! 실제로, 우리는 아마 할 수 있었다. 그러나 이미 ViewModel 속성을 설정할 것으로 기대하는 코드가 있습니다. 또한 다른 사용자 컨트롤의 다른 속성에 동일한 문제가있어이를 작동시키는 방법을 배우고 싶습니다. –

+0

어떻게 CasingListViewModel이 선언 되었습니까? 창 리소스 또는 속성입니까? –

답변

6

가끔씩 발생하는 문제는 우리가 생각한 것과 완전히 다르지 않습니다.

저는 세터가 절대 호출되지 않는다고 언급했습니다. 사실입니다. 위의 코드는 약간 깔끔하게 정리했습니다. 불행히도 SetValue에 대한 호출을 따라 Setter의 명령문을 정리했습니다. 속성이 데이터 바인딩을 통해 설정 될 때 세터 사실을 우회, 지금 this excellent article에서 배운 것처럼

public ViewModelBase ViewModel 
{ 
    get { return GetValue(ViewModelProperty) as ViewModelBase; } 
    set 
    { 
     SetValue(ViewModelProperty, value); 
     DataContext = value; 
    } 
} 

: 그 문은, DataContext에이 같은 것을 값을 할당. 대신 프레임 워크는 DependencyObject에 대해 직접 작동합니다. 따라서 속성은 실제로 설정되었지만 setter는 결코 호출되지 않았으며 (결과적으로) DataContext는 null로 남았고 아무 것도 작동하지 않았습니다.

So : 먼저 답할 수없는 질문에 대해 사과드립니다. 둘째, 그것을 보충하는 방법으로 매우 중요한 조언을 전합니다.

GetValue() 및 SetValue() 이외의 항목은 getter/setter 속성에 넣지 마십시오. 항상 전화!

편집 : 나중에이 접근법에 대한 또 다른 문제점을 발견했습니다. 이 방법으로 DataContext를 설정하면, 실제로 바인딩을 지원하는 원래 데이터 컨텍스트를 잃게됩니다. 결과는 속성이 즉시 null로 재설정됩니다. 전체적으로 좋은 접근 방식이 아닙니다.

+0

답변으로 표시 함 –

+0

나는 하겠지만, 아직 허용되지 않습니다. - 자신의 답변을 수락하기 위해 2 일의 지연이 있습니다. –