2011-06-15 28 views
1

我在WP7應用程序中使用標準的透視模板。如何將usercontrol綁定到應用程序viewmodel

我有一些額外的屬性中定義的MainViewModel類:

public class MainViewModel : INotifyPropertyChanged 
{ 
    ... 
    private MyClass selectedKey_m; 
    public MyClass SelectedKey 
    { 
     get 
     { 
      ... 
     } 
     set 
     { 
      if (value != this.selectedKey_m) 
      { 
       this.selectedKey_m = value; 
       NotifyPropertyChanged("SelectedKey"); 
      } 
     } 
    } 
} 

App類有一個視圖模型實例:

private static MainViewModel viewModel = null; 
public static MainViewModel ViewModel 
{ 
    get 
    { 
     // Delay creation of the view model until necessary 
     if (viewModel == null) 
      viewModel = new MainViewModel(); 

     return viewModel; 
    } 
} 

我MainPage.xaml.cs中設置的DataContext:

DataContext = App.ViewModel; 

從這裏,我可以設置ListBox的雙向綁定,我知道它的工作原理becaus e如果我在viewmodel的SelecetdKey屬性上放置一個斷點,我可以看到setter被調用。

我的問題是,我有我自己的用戶控件綁定到視圖模型的SelectedKey屬性,但我的用戶控件中的屬性永遠不會設置viewmodel更新時,我不能找出原因。

這裏是我的用戶控件:

public partial class MyUserControl : UserControl 
{ 
    public static readonly DependencyProperty SelectedKeyProperty = DependencyProperty.Register(
     "SelectedKey", typeof(MyClass), typeof(MyUserControl), new PropertyMetadata(null)); 

    public MyClass SelectedKey 
    { 
     get { return (MyClass)this.GetValue(SelectedKeyProperty); } 
     set { this.SetValue(SelectedKeyProperty, value); } 
    }  
} 

這裏是我的主網頁的XAML:

<local:MyUserControl x:Name="myUC" SelectedKey="{Binding Path=SelectedKey}"> 

我期望我的用戶控件的SelectedKey屬性的setter得到在視圖模型的SelectedKey屬性被改變時調用,但不是。

我也嘗試設置在XAML我的用戶控件的DataContext:

DataContext="{Binding Path=App.ViewModel}" 

回答

0

調試器不步入二傳,不知道爲什麼。

嘗試增加對調用屬性值更改回調:

public static readonly DependencyProperty SelectedKeyProperty = DependencyProperty.Register(
     "SelectedKey", typeof(MyClass), typeof(MyUserControl), new PropertyMetadata(MyPropertyChanged)); 

private static void MyPropertyChanged(object sender, DependencyPropertyChangedEventArgs args) 
{ 
} 
+0

試過這個,沒有運氣。我也使用ILSpy來查看TextBlock代碼,它也沒有這個,但它似乎工作。我錯過了什麼...... – Jeremy 2011-06-17 01:23:01

0

解決。我不得不添加靜態方法ptauzen suggested,而且從我的XAML中刪除的DataContext約束力的聲明:

DataContext="{Binding Path=App.ViewModel}" 

因爲的MainPage設置在構造函數中的datacontext,是因爲我的用戶控制是主要的孩子頁面,它會繼承數據上下文。我需要的只是確保我的用戶控件屬性的綁定已設置:

SelectedKey="{Binding SelectedKey}" 
相關問題