我编写了一个简单的自定义控件,它继承自文本框并使用自定义输入框输入文本:
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)
的按钮,但它总是空的。我在这做错了什么?
答案 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时。)