2011-03-03 55 views
0

我試圖將我的ViewModel的IsInInputMode屬性綁定到UserControl中的依賴屬性。我將UserControl的DataContext設置爲ViewModel的一個實例,並且所有基於XAML的綁定都能正常工作。我需要一個代碼隱藏解決方案來創建這個綁定。我已經嘗試了一些沒有工作的東西(在帖子的底部)。數據綁定到用戶控件的UserControl的依賴屬性的ViewModel的問題 - 背後

我沒有收到記錄到輸出窗口的任何異常,這是我被告知尋找基於綁定的異常的地方。

我問過類似的question,通過XAML綁定UserControl中的Dependency Property - 我被告知這是不可能的,所以我正在尋找一個代碼隱藏解決方案。

視圖模型看起來像這樣:

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綁定到一個按鈕的命令是數據。

依賴屬性的用戶控件看起來像這樣:

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屬性發生更改時,依賴屬性永遠不會更新,並且兩個偶數處理程序都不會被調用。

作爲附加的註釋,視圖模型有幾個ICommand屬性,正在通過XAML成功綁定到按鈕的用戶控件 - 所以我知道DataContext的正確結合。

回答

0

原來,這是一個PEBKEC問題 - 我有一個默認值設置的地方,所以OnNotifyPropertyChanged永遠不會被調用,因爲它似乎綁定被打破。

我結合我的布爾對視圖複選框,並使用UI控件來更改值迫使我的動畫改變,正確的代碼隱藏結合是我第一次嘗試:

SetBinding(IsInInputModeProperty, "IsInInputMode"); 
0

綁定機制捕獲進程中拋出的異常,並僅在「輸出」窗口中顯示它們。你是否檢查輸出窗口的錯誤?

+0

什麼類型我應該尋找錯誤嗎?我看到很多「vshost.XXXX退出代碼0(0x0)」。 – Nate 2011-03-03 20:21:50

+0

不,這其實沒關係。你有沒有看到任何「數據例外」? – 2011-03-03 22:05:20

+0

不,沒有任何例外。只是有關加載程序集和退出代碼的所有信息,全部爲0x0。 – Nate 2011-03-03 23:27:14

相關問題