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 で Custom Text プロパティをバインドしています -

<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また、プロパティを更新するプロパティの PropertyChangedCallback を定義する必要がある場合もありTextます (つまり、現在実装しているものとは逆方向)。そうしないと、ViewModel プロパティに最初に含まれていたものが TextBox に表示されず、もちろん ViewModel プロパティが変更されても更新されません。

于 2013-01-31T14:41:17.957 に答える