2011-06-14 80 views
0

我有一個UserControl,我們將其稱爲「Header」。它有一個叫做專案編號的DependencyProperty,這種控制有一個視圖模型,我將其設置爲在DataContext:DataContext,DependencyProperties和綁定

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); 
    } 
} 

現在我想做的事,是綁定控件的專案編號這種控制的專案編號:

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

現在,當我運行它,我得到一個錯誤,指出「

物業GET方法沒有找到InitializeControl()方法。

從我正在閱讀,我看到這是因爲綁定ProjectID是相對於控件的數據上下文。當然,我可以內結合設置的ElementName:

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

但這是醜,說實話,我們不想記住要爲這個控制每當我們使用它做到這一點。我還有什麼其他選擇?有沒有辦法將綁定的源設置爲使用父級的DataContext?

+0

的專案編號是不是也該視圖模型的屬性?如果沒有,爲什麼不呢,這是ViewModel的角色。 – AnthonyWJones 2011-06-14 15:14:05

回答

0

我在代碼中複製了你的概念,它編譯並運行正常。

我已經在下面包含了控制代碼和viewmodel,以防你正在做不同的事情。

*注:我不停的視圖模型專案編號爲簡單的更新特性:

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

但是,如果將此用戶控件包含到不同的控件中,並將父控件的某些內容綁定到此控件的屬性,那麼我期望看到該錯誤。 所以我們正在處理的是父控制(我們稱之爲MainView)有它自己的VM和自己的datacontext。這是我們然後要將MainView.VM.CurrentProjectID綁定到Header.ProjectID: '' 其中CurrentProjectID是MainView的虛擬機的成員。 – 2011-06-14 15:53:51

+0

@Timothy Baldridge:我建立了一個更完整的例子,正如你建議在主窗口上使用視圖模型等,它也能正常工作。你能發佈更多代碼和Xaml嗎?這可能是一個非常簡單的錯誤。 – 2011-06-14 20:28:56