8

我有一个自定义文本框,定义如下:

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 正在更新,但我想我需要做一些额外的事情来使绑定也能正常工作。

我不做什么?我将不胜感激有关此的任何帮助。

谢谢

4

1 回答 1

8

我想绑定需要是双向的。

<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));

您可能还必须为CustomText更新Text属性的属性定义一个 PropertyChangedCallback(即您现在实现的另一个方向)。否则,TextBox 不会显示最初包含在 ViewModel 属性中的任何内容,当然也不会在 ViewModel 属性更改时更新。

于 2013-01-31T14:41:17.957 回答