2011-06-15 2 views
1

WP7 응용 프로그램에서 표준 피벗 템플릿을 사용하고 있습니다.usercontrol을 응용 프로그램에 바인딩하는 방법 viewmodel

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

앱 클래스는 뷰 모델 인스턴스가 있습니다 :

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를 :

나는 몇 가지 추가 속성 정의 MainViewModel 클래스가

DataContext = App.ViewModel; 

여기에서 ListBox에 대해 양방향 바인딩을 설정할 수 있습니다. 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 속성에 대한 세터 얻을 것으로 기대 뷰 모델의 SelectedKey 속성이 변경되었지만 호출되지 않을 때 호출됩니다.

나는 또한 XAML에서 내 사용자 컨트롤의 데이터 컨텍스트를 설정 시도했다 :

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

0

를 해결. MainPage 생성자의 데이터 컨텍스트를 설정하기 때문에 내 사용자 컨트롤이 주요의 자식 그래서 때문에,

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

: 나는 ptauzen suggested로 정적 메소드를 추가 할뿐만 아니라, 내 XAML에서 DataContext에 바인딩 문을 제거했다 페이지에서 데이터 컨텍스트를 상속합니다. 내가 필요한 것은 내 사용자 컨트롤 속성의 바인딩을 설정하는 것입니다 :

SelectedKey="{Binding SelectedKey}" 
관련 문제