WPF绑定到自定义控件中的自定义属性

9

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

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正在更新,但我想我需要做一些额外的工作使绑定也起作用。
我该怎么做?对此提供任何帮助都将不胜感激。
谢谢。

你试图通过PropertyChanged回调实现什么目标?在我看来,你只是设置了一个新值,这就是为什么调用了这个回调,它再次被WPF捕获,否则你将会陷入无限循环。 - dowhilefor
1个回答

8

我猜绑定需要是双向的。

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

如果您默认将CustomText属性双向绑定,则不需要指定Mode
public static readonly DependencyProperty CustomTextProperty =
    DependencyProperty.Register(
        "CustomText", typeof(string), typeof(CustomTextBox),
        new FrameworkPropertyMetadata(
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

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


谢谢!那个方法可行。但是,当我在文本框中没有输入任何内容并尝试刷新页面时(我认为它会刷新UC,但我不确定),我会收到这样的异常:键不能为空。 参数名:key - Duke Cyrillus
这听起来似乎与此属性或绑定无关。“刷新页面”具体是什么意思? - Clemens
1
有一个按钮,可以对所有字段执行验证(使用IDataErrorInfo完成,并重新分配每个属性的值)。 当我点击此按钮时,它会顺利地进行验证,但一旦完成后,应用程序就会抛出上述异常。 我尝试删除绑定(并使用TextBox的Text属性),它可以正常工作。 当我绑定CustomText / Text属性时,就会出现这个异常,这就是我认为是绑定引起问题的原因。 - Duke Cyrillus
仍然很难确定名为“key”的参数到底是什么,因为它是空的。也许它是你的ViewModelProperty不能为null?也许你需要将CustomText属性的默认值指定为string.Empty - Clemens
ViewModelProperty 可能为空 - 这是无效的值,但应该在验证期间处理,这是有效的,即为该场景正确分配了错误消息。我还指定了 CustomText 的默认值以防万一,但仍然不起作用。异常的堆栈跟踪对我也没有帮助,因为它没有指向我的代码中的任何内容。 - Duke Cyrillus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接