我已实施自定义TextBox
:
public class MyTextBox : TextBox
{
// ...
}
我正在使用XAML:
<MyTextBox Text="{Binding MyProperty}" />
并且它绑定到我的ViewModel中的属性。
public class MyDataContext : INotifyPropertyChanged
{
public string MyProperty
{
get { return _myPropertyBackingField; }
set
{
_myPropertyBackingField = value;
PropertyChanged(this, new PropertyChangedEventArgs("MyProperty"));
}
}
// ...
}
问题:我如何在MyTextBox
中检测到MyProperty
已更改?
MyProperty = "NewValue";
优选地,我想区分程序性变化与用户编辑值触发变更的时间。也就是说,我不认为覆盖OnPropertyChanged
对我有用。
答案 0 :(得分:1)
您可以注册PropertyChanged
TextBox
DataContext
的{{1}}事件。
var dataContext = DataContext as MyDataContext;
dataContext.PropertyChanged += dataContext_PropertyChanged;
// check for the propertyname and react
void dataContext_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "MyProperty")
{
// Do things
}
}
因此,如果您的viewmodel引发PropertyChanged
,您的文本框也会收到通知。但我认为这是不好的做法。你想要达到什么目标?
答案 1 :(得分:0)
过了一段时间后,我意识到这是绑定,它跟踪从源(DataContext)更新TextBox
。因此,可能采取的方法是致电GetBindingExpression(TextProperty)
并从中解决问题。
但是,我通过覆盖TextBoxBase.OnTextChanged
:
protected override void OnTextChanged(TextChangedEventArgs e)
{
base.OnTextChanged(e);
if (!IsFocused)
{
// Do stuff here
}
}
由于控件没有聚焦,因此必须以编程方式完成更改。这并不完美,因为当TextBox
有焦点时,可能会出现一个编程上的变化,但这对我来说已经足够了。