2011-06-14 6 views
0

나는 UserControl을 가지고 있는데, 우리는 그것을 "Header"라고 부를 것이다. 그것은 ProjectID라는 DependencyProperty에 있으며,이 컨트롤은보기 모델을 가지고 있는데 DataContext를 수를 설정합니다DataContext, DependencyProperties and Bindings

public BillingInfoHeaderControlVM VM 
{ 
    get 
    { 
     return (BillingInfoHeaderControlVM)DataContext; 
    } 
    set 
    { 
     DataContext = value; 
    } 

} 

public static readonly DependencyProperty ProjectIDProperty = 
         DependencyProperty.Register("ProjectID", typeof(int), typeof(BillingInfoHeaderControl), new PropertyMetadata(); 

public int ProjectID 
{ 
    set 
    { 
     SetValue(ProjectIDProperty, value); 
    } 
    get 
    { 
     return (int)GetValue(ProjectIDProperty); 
    } 
} 

이제 내가하고 싶은 것,이 컨트롤의 ProjectID에 컨트롤의 ProjectID를 결합하는 것입니다

나는이 프로그램을 실행할 때
<controls:Header Grid.Row ="0" x:Name="Header" ProjectID="{Binding ProjectID, Mode=OneWay}"></controls:Header> 

는 지금, 나는

재산권이 방법은 찾을 수 없습니다하기 "내용의 InitializeControl() 메서드에서 오류가 발생합니다.

내가 읽고있는 바로는 ProjectID 바인딩이 컨트롤의 데이터 컨텍스트와 관련되어 있기 때문입니다.

<controls:Header Grid.Row ="0" x:Name="Header" ProjectID="{Binding ProjectID, Mode=OneWay, ElementName=ParentControl}"></controls:Header> 

을하지만이 못생긴, 우리는 우리가 그것을 사용할 때마다이 컨트롤이 일을 기억하고 싶지 않아요 솔직히 말해서 : 물론 바인딩 내에서 ElementName을 설정할 수 있습니다. 다른 옵션은 무엇입니까? 부모의 DataContext를 사용하도록 바인딩 소스를 설정하는 방법이 있습니까?

+0

ProjectID로 뷰 모델 ProjectID을 유지 또한 뷰 모델의 속성 아닌가요? 그렇지 않은 경우 ViewModel의 역할입니다. – AnthonyWJones

답변

0

코드에서 개념을 복제했는데 제대로 컴파일되고 실행됩니다.

나는 뭔가 다른 일을 할 경우에 대비하여 아래에 제어 코드와 뷰 모델을 포함 시켰습니다.

* 참고 : 나는 간단한 업데이트 속성 :

namespace Demo1 
{ 
    public partial class BillingInfoHeaderControl : UserControl 
    { 
     public BillingInfoHeaderControl() 
     { 
      InitializeComponent(); 
      this.DataContext = new BillingInfoHeaderControlVM(); 
     } 

     public int ProjectId 
     { 
      get { return (int)GetValue(ProjectIdProperty); } 
      set { SetValue(ProjectIdProperty, value); } 
     } 

     public static readonly DependencyProperty ProjectIdProperty = 
      DependencyProperty.Register("ProjectId", typeof(int), typeof(BillingInfoHeaderControl), 
       new PropertyMetadata(0)); 

    } 
} 

namespace Demo1 
{ 
    public class BillingInfoHeaderControlVM : INotifyPropertyChanged 
    { 
     private int _projectId; 
     public int ProjectId 
     { 
      get { return _projectId; } 
      set 
      { 
       if (_projectId != value) 
       { 
        _projectId = value; 
        if (PropertyChanged != null) 
        { 
         PropertyChanged(this, new PropertyChangedEventArgs("ProjectId")); 
        } 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
    } 
} 
+0

하지만이 UserControl을 다른 컨트롤에 포함하고 부모 컨트롤에서이 컨트롤의 속성에 바인딩하면 오류가 발생할 것으로 예상됩니다. 그래서 우리가 다루는 것은 부모 컨트롤 (이 컨트롤을 MainView라고 부름)이 자체 VM과 자체 datacontext를 가지고 있다는 것입니다. 이제 우리는 MainView.VM.CurrentProjectID를 Header.ProjectID에 바인딩하려고합니다. '' 여기서 CurrentProjectID는 MainView의 VM 멤버입니다. –

+0

@Timothy Baldridge : 기본 창에서 뷰 모델을 사용하는 것이 좋겠다고 제안하면서 더 많은 예제를 만들었고 올바르게 작동합니다. 좀 더 많은 코드와 Xaml을 게시 할 수 있습니까? 그것은 매우 간단한 실수 일 가능성이 높습니다. –