WPF 无法在 TextBox 的 AddLostFocusHandler 属性上设置 Binding 的解决方法
这个错误是因为'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' 事件处理程序来处理控件的失去焦点事件。
原文地址: https://www.cveoy.top/t/topic/njfg 著作权归作者所有。请勿转载和采集!