这个错误是因为'AddLostFocusHandler' 属性不是一个依赖属性,而是一个普通属性,不能直接绑定数据。如果想要绑定数据,需要使用依赖属性来实现。

可以通过创建一个自定义的依赖属性,然后在属性的'PropertyChangedCallback' 事件中添加'LostFocus' 事件处理程序来实现绑定数据和处理失去焦点事件的功能。例如:

public static readonly DependencyProperty TextProperty =
    DependencyProperty.Register("Text", typeof(string), typeof(MyTextBox),
        new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnTextChanged));

public string Text
{
    get { return (string)GetValue(TextProperty); }
    set { SetValue(TextProperty, value); }
}

private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MyTextBox textBox = (MyTextBox)d;
    textBox.TextChanged?.Invoke(textBox, EventArgs.Empty);
}

public event EventHandler TextChanged;

public MyTextBox()
{
    AddHandler(LostFocusEvent, new RoutedEventHandler(OnLostFocus));
}

private void OnLostFocus(object sender, RoutedEventArgs e)
{
    BindingExpression bindingExpr = GetBindingExpression(TextProperty);
    if (bindingExpr != null)
    {
        bindingExpr.UpdateSource();
    }
}

在这个例子中,我们创建了一个名为'Text' 的依赖属性,并在构造函数中添加了一个'LostFocus' 事件处理程序。在事件处理程序中,我们检查是否有绑定表达式,并调用'UpdateSource' 方法来更新源数据。同时,我们还创建了一个名为'TextChanged' 的事件,当文本发生改变时,会触发这个事件。

这样,我们就可以在XAML中使用这个自定义的文本框控件,并绑定数据和处理失去焦点事件了:

<local:MyTextBox Text='{Binding MyText}' LostFocus='MyTextBox_LostFocus'/>

其中,'MyText' 是ViewModel中的一个属性,当文本框失去焦点时,会自动更新这个属性。同时,在XAML中也可以添加一个'LostFocus' 事件处理程序来处理控件的失去焦点事件。

WPF 无法在 TextBox 的 AddLostFocusHandler 属性上设置 Binding 的解决方法

原文地址: https://www.cveoy.top/t/topic/njfg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录