WPF绑定到自定义控件(文本框)不起作用

时间:2014-09-16 08:10:10

标签: wpf binding custom-controls

我编写了一个简单的自定义控件,它继承自文本框并使用自定义输入框输入文本:

class TextTextbox : TextBox
{

    public string InputBoxTitle { get; set; }

    public string Input { get; set; }

    public TextTextbox()
    {
        PreviewMouseDown += MyTextbox_MouseDown;
    }

    private void MyTextbox_MouseDown(object sender, MouseButtonEventArgs mouseButtonEventArgs)
    {
        TextBox tb = (TextBox)sender;
        var dialog = new BFH.InputBox.InputBox(InputBoxTitle, Input);
        dialog.ShowDialog();

        if (!dialog.Canceled)
            tb.Text = dialog.Input;
        else
            tb.Text = Input;
    }
}

我在这样的视图中使用它:

<CustomControls:TextTextbox Text="{Binding Test}" InputBoxTitle="Titel" Input="Input"/>

在vm中进行测试:

private string _test;
public string Test
    {
        get { return _test; }
        set
        {
            if (_test == value)
                return;
            _test = value;
            RaisePropertyChanged("Test");
        }
    }

但是对Test的绑定无效。在视图中,我看到文本框的文本确实发生了变化,但我似乎没有链接到VM的属性。我添加了一个MessageBox.Show(Test)的按钮,但它总是空的。我在这做错了什么?

1 个答案:

答案 0 :(得分:1)

您需要将绑定的UpdateSourceTrigger属性设置为PropertyChanged。否则,在TextBox失去焦点之前,不会更新源属性Test

<CustomControls:TextTextbox
    Text="{Binding Test, UpdateSourceTrigger=PropertyChanged}" ... />

来自MSDN上Binding.UpdateSourceTrigger页面上的示例部分:

  

TextBox.Text属性的默认UpdateSourceTrigger值为   引发LostFocus。这意味着如果应用程序具有带有的TextBox   数据绑定TextBox.Text属性,您在TextBox中键入的文本   在TextBox失去焦点之前不会更新源(for   例如,当您单击TextBox时。)