2013-01-31 77 views
4

我定義了一個自定義文本框,如下所示:WPF綁定到一個自定義屬性自定義控制

public class CustomTextBox : TextBox 
{ 
    public static DependencyProperty CustomTextProperty = 
      DependencyProperty.Register("CustomText", typeof(string), 
      typeof(CustomTextBox)); 

    static CustomTextBox() 
    { 
     TextProperty.OverrideMetadata(typeof(SMSTextBox), 
         new FrameworkPropertyMetadata(string.Empty, 
         FrameworkPropertyMetadataOptions.Journal | 
          FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
         new PropertyChangedCallback(CustomTextBox_OnTextPropertyChanged)); 
    } 

    public string CustomText 
    { 
     get { return (string)GetValue(CustomTextProperty); } 
     set { SetValue(CustomTextProperty, value); } 
    } 

    private static void CustomTextBox_OnTextPropertyChanged(DependencyObject d, 
        DependencyPropertyChangedEventArgs e) 
    { 
     CustomTextBox customTextBox = d as CustomTextBox; 

     customTextBox.SetValue(CustomTextProperty, e.NewValue); 
    } 
} 

我綁定在XAML自定義文本屬性 -

<local:CustomTextBox CustomText="{Binding ViewModelProperty}" /> 

的我面臨的問題是,當我在CustomTextBox中輸入任何內容時,更改不會反映在ViewModelProperty中,即ViewModelProperty沒有更新。 CustomTextProperty正在更新,但我想我需要做一些額外的事情來完成綁定工作。

我沒有做什麼?我將不勝感激這方面的幫助。

謝謝

+0

你想用PropertyChanged回調來完成什麼?對我來說,它看起來像你只是設置一個新的價值,這就是爲什麼這個回調被稱爲,它再次幸運地被wpf捕獲,否則你會有一個無限循環。 – dowhilefor

回答

5

我想綁定需要是雙向的。

<local:CustomTextBox 
    CustomText="{Binding ViewModelProperty, Mode=TwoWay}" /> 

你不會需要指定Mode如果您在默認情況下做出的CustomText屬性綁定雙向的:

public static readonly DependencyProperty CustomTextProperty = 
    DependencyProperty.Register(
     "CustomText", typeof(string), typeof(CustomTextBox), 
     new FrameworkPropertyMetadata(
      FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

您可能還需要定義一個PropertyChangedCallback爲CustomText屬性,更新Text屬性(即您現在實施的其他方向)。否則,TextBox將不顯示最初包含在ViewModel屬性中的任何內容,當ViewModel屬性更改時當然不會更新。

+0

謝謝!這工作。但是,當我沒有在文本框中輸入任何內容並嘗試刷新頁面(我認爲它刷新了UC,但我不確定)時,我得到如下異常: 鍵不能爲空。 參數名稱:密鑰 –

+0

聽起來不像是與此屬性或綁定有關的事情。什麼意思是「刷新頁面」? – Clemens

+0

有一個按鈕在所有字段上執行驗證(這是使用IDataErrorInfo完成的,併爲每個屬性重新賦值)。當我點擊這個按鈕時,它會在沒有任何問題的情況下通過驗證,但是一旦完成,應用程序就會拋出上述異常。我嘗試刪除綁定(並使用TextBox的Text屬性),它工作得很好。當我綁定CustomText/Text屬性時,我得到異常,這就是爲什麼我認爲它是導致問題的綁定。 –