我创建了一个扩展 TextBox 的 CustomTextBox。
我已经覆盖了 TextProperty 的元数据,因为我想在文本更改时触发一个方法,但是当我运行代码并编辑文本框时,我只看到 OnTextPropertyChanged 事件触发了两次。第一次是当我初始化文本框时,第二次是当我关闭窗口时。
如何在文本框中每次击键时触发此功能?
AppTextBox.cs:
public class AppTextBox : TextBox
{
static AppTextBox()
{
TextProperty.OverrideMetadata(typeof(AppTextBox),
new FrameworkPropertyMetadata(
string.Empty,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal,
OnTextPropertyChanged,
null,
true,
UpdateSourceTrigger.PropertyChanged)
);
DefaultStyleKeyProperty.OverrideMetadata(typeof(AppTextBox), new FrameworkPropertyMetadata(typeof(AppTextBox)));
}
private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// TODO: Check if Text is null or empty...
}
}
用途:
<ctrl:AppTextBox Text="{Binding NewWord.WrittenForm}" />
所以当我第一次加载文本框时,内容是“Foo”。
当我添加或删除字母时,我希望 OnTextPropertyChanged 被触发,但事实并非如此。我应该做一些不同的事情来实现我的目标吗?
这个
propdp
可以简化。
public static new readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(AppTextBox), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnTextPropertyChanged)));
public new string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Debug.WriteLine("OnTextPropertyChanged");
}
技巧是在派生控件上提供绑定
x:Name="self"
Text="{Binding ElementName=self, Path=Text, UpdateSourceTrigger=PropertyChanged}"