WPF 不能在TextBox类型的AddLostFocusHandler属性上设置Binding。只能在 DependencyObject 的 DependencyProperty 上设置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/bWpT 著作权归作者所有。请勿转载和采集!