2011-03-03 2 views
0

UserControl의 Dependency 속성에 내 ViewModel의 IsInInputMode 속성을 바인딩하려고합니다. 내 ViewModel의 인스턴스에 UserControl의 DataContext를 설정하고 모든 XAML 기반 바인딩이 올바르게 작동합니다. 이 바인딩을 만들려면 코드 숨김 솔루션이 필요합니다. 나는 일하지 않은 몇 가지 (게시물 하단에) 시도했습니다.UserControl 코드 종속성에서 UserControl의 Dependency 속성에 ViewModel을 바인딩하는 데 문제가 있습니다.

출력 창에 아무런 예외도 기록되지 않습니다. 여기에는 바인딩 기반 예외를 찾는 위치가 있습니다.

이 비슷한 question, XAML 통해 UserControl 종속성 속성 바인딩 - 나는 이것이 불가능한, 그래서 코드 숨김 솔루션을 찾고 있어요 물었다.

는 뷰 모델은 다음과 같습니다

class AddClientViewModel : ViewModelBase 
{ 
    private Boolean _isInInputMode; 
    public Boolean IsInInputMode 
    { 
     get { return _isInInputMode; } 
     set 
     { 
      _isInInputMode = value; 
      OnPropertyChanged("IsInInputMode"); 
     } 
    } 

    public ICommand Cancel 
    { 
     get { return new RelayCommand(parm => { IsInInputMode = false; }); } 
    } 
} 

Cancel 명령이 성공적으로 XAML을 통해 버튼의 명령에 바인딩되는 데이터입니다.

는 해당 UserControl의 종속성 속성은 다음과 같습니다 : 내 UserControl을의 생성자에 바인딩

public bool IsInInputMode 
    { 
     get { return (bool)GetValue(IsInInputModeProperty); } 
     set { SetValue(IsInInputModeProperty, value); } 
    } 
    public static readonly DependencyProperty IsInInputModeProperty = 
     DependencyProperty.Register("IsInInputMode", typeof(bool), typeof(AddClientView), new UIPropertyMetadata(new PropertyChangedCallback(_OnIsInInputModePropertyChanged))); 

    private static void _OnIsInInputModePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var mycontrol = d as AddClientView; 

     bool oldValue = (bool)e.OldValue; 
     bool newValue = (bool)e.NewValue; 

     if (null != mycontrol && oldValue != newValue) 
     { 
      mycontrol._OnIsInInputModeChanged(oldValue, newValue); 
     } 
    } 

    private void _OnIsInInputModeChanged(bool oldValue, bool newValue) 
    { 
     if (newValue) 
     { 
      VisualStateManager.GoToState(this, "InputState", false); 
     } 
     else 
     { 
      VisualStateManager.GoToState(this, "HiddenState", false); 
     } 
    } 

몇 번 반복했다.

의 첫 번째 시도 :

public AddClientView() 
    { 
     InitializeComponent(); 
     SetBinding(IsInInputModeProperty, "IsInInputMode"); 
    } 

두 번째 시도 :

public AddClientView() 
    { 
     InitializeComponent(); 

     var b = new Binding(); 
     b.Source = this.DataContext; 
     b.Path = new PropertyPath("IsInInputMode"); 
     b.Mode = BindingMode.TwoWay; 
     b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
     BindingOperations.SetBinding(this, IsInInputModeProperty, b); 
    } 

어느 이들의 컴파일러 또는 런타임 오류 "실패"; 그러나 ViewModel에서 IsInInputMode 속성이 변경되면 종속성 속성이 업데이트되지 않고 두 개의 짝수 핸들러가 호출되지 않습니다. 그래서 DataContext를 올바르게 바인딩 알 -

은 추가 참고로, 뷰 모델은 가 성공적으로 XAML을 통해 해당 UserControl에서 버튼에 바인드되고있는 몇 ICommand 특성을 가지고 있습니다.

답변

0

문제는 PEBKEC 문제였습니다. 어딘가에 기본 값이 설정되어 OnNotifyPropertyChanged가 호출되지 않았으므로 바인딩이 손상된 것처럼 보였습니다.

내가보기에 체크 박스에 내 부울을 구속하고, 값이 올바른 코드 숨김 된 바인딩 내 첫 번째 시도 변경 내 애니메이션을 강제로 변경하는 UI 컨트롤을 사용 :의

SetBinding(IsInInputModeProperty, "IsInInputMode"); 
0

바인딩 메커니즘은 프로세스에서 발생하는 예외를 캐치하고 출력 창에만 표시합니다. 출력 창에서 오류를 확인 했습니까?

+0

어떤 종류의 오류를 찾아야합니까? "vshost.XXXX가 코드 0 (0x0)으로 종료되었습니다." – Nate

+0

아니요, 실제로는 괜찮습니다. 거기에 "데이터 예외"가 보이십니까? –

+0

아니, 예외는 아예 없습니다. 어셈블리 및 종료 코드로드에 대한 다양한 정보 (모두 0x0). – Nate

관련 문제