WPF 扩展文本框覆盖无法正常工作

问题描述 投票:0回答:1

我创建了一个扩展 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 被触发,但事实并非如此。我应该做一些不同的事情来实现我的目标吗?

wpf textbox overriding metadata custom-controls
1个回答
0
投票

这个

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}"
© www.soinside.com 2019 - 2024. All rights reserved.