WPF 绑定binding都有哪些事件
主要包含以下几个事件:
1. UpdateSourceTrigger:用于控制数据绑定如何更新源数据的事件
- PropertyChanged:每当目标属性的值更改时,将立即更新源属性。
- LostFocus:当目标元素失去焦点时,更新源属性。
- Explicit:只有在调用BindingExpression.UpdateSource方法时才会更新源属性。
- Default:与绑定目标和属性的数据类型有关,通常是LostFocus或PropertyChanged事件。
- Explicit和LostFocus是最常见的UpdateSourceTrigger事件,而PropertyChanged是最常用的默认事件。
2. NotifyOnTargetUpdated:指定当绑定目标发生更改时是否引发TargetUpdated事件。
- 如果将此属性设置为true,则当目标属性更改时,将在绑定源上引发TargetUpdated事件(可在该事件中通知绑定源进行相应的更改)。
- 需要注意的是,如果在绑定中使用了Mode属性,并且Mode属性的值为TwoWay,则NotifyOnTargetUpdated属性将被忽略。这是因为在TwoWay模式下,更改源或目标都会引发另一个方向上的更新。
3. NotifyOnSourceUpdated:指定当绑定源发生更改时是否引发SourceUpdated事件。
- 如果将此属性设置为true,则当源属性更改时,将在绑定目标上引发SourceUpdated事件(可在该事件中通知绑定目标进行相应的更改)。
- 需要注意的是,如果在绑定中使用了Mode属性,并且Mode属性的值为TwoWay,则NotifyOnSourceUpdated和属性将被忽略。这是因为在TwoWay模式下,更改源或目标都会引发另一个方向上的更新。
4. ValidatesOnDataErrors:是一个可选的事件,它允许开发人员在数据绑定时验证数据,是用于指定是否启用数据验证错误。
- 当设置了该事件时,WPF会在数据源中实现IDataErrorInfo接口的类中的Error属性发生更改时,自动调用该事件。开发人员可以使用该事件来检测数据绑定中的错误,并采取适当的措施,例如禁用按钮或显示错误消息。如果开发人员不设置ValidatesOnDataErrors事件,则WPF将不会在数据绑定中自动执行数据验证。如何利用 IDataErrorInfo 实现数据校验 - LXLR - 博客园 (cnblogs.com)
- 当数据验证失败时,绑定会将错误信息存储在Binding对象的Validation.Errors属性中。但是,这些错误信息不会自动显示在UI元素中,需要使用NotifyOnValidationError属性来实现。
5. NotifyOnValidationError:用于指定当数据验证失败时是否触发属性更改事件。
- 如果设置为True,则当数据验证失败时,属性更改事件将被触发,这意味着可以在代码中捕获和处理该事件。如果设置为False,则属性更改事件将不会在数据验证失败时触发。
- 当NotifyOnValidationError属性设置为True时,如果绑定数据时发生验证错误,Binding会引发一个Validation.Error事件,该事件可以被UI元素捕获并显示错误信息。
答疑解惑:
1. 源属性和目标属性是指什么?
——源属性(Source Property)指的是提供数据的属性,通常是数据模型或者其他控件的属性,而目标属性(Target Property)则是数据绑定的目标,通常是绑定到控件的属性,例如TextBlock的Text属性。数据绑定将源属性的值自动更新到目标属性中。
2. 源属性的set方法中会触发PropertyChangedEventHandler事件,如果绑定的Mode属性是TwoWay,会再循环触发源属性的set方法吗?
——不会。当源属性的set方法触发PropertyChangedEventHandler事件时,只有绑定的目标属性会被更新,不会再次触发源属性的set方法。这是因为在TwoWay模式下,数据绑定会自动同步源属性和目标属性的值,避免了循环触发set方法的情况。
3. 可以同时设置NotifyOnSourceUpdated = true、NotifyOnTargetUpdated=true、UpdateSourceTrigger=PropertyChanged吗?——可以,这意味着当源属性或目标属性的值改变时,会触发相应的属性更改事件,并立即将更改的值更新到源属性。
4. WPF 绑定什么时候会触发源属性的set方法?
——WPF绑定是一种机制,用于将数据从一个对象传递到另一个对象。
在WPF中,绑定通常用于将UI元素(如文本框、标签等)与数据模型中的属性绑定在一起。当UI元素的值发生变化时,绑定会自动将新值赋给数据模型中的属性,从而实现数据的同步更新。
在WPF绑定中,当绑定目标属性的值发生变化时,会自动触发源属性的set方法。这是因为WPF绑定是双向绑定,即绑定目标属性和源属性之间是双向的。当目标属性的值发生变化时,会自动将新值赋给源属性,从而触发源属性的set方法。这样,数据模型中的属性就会被更新,从而保持与UI元素的同步。
例如,假设有一个数据模型类Person,其中有一个属性Name:
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
现在,我们将一个文本框与Person类的Name属性绑定在一起:
<TextBox Text="{Binding Name}" x:Name="myText" DataContext="dataContext"/>
当用户在文本框中输入新的值时,绑定会自动将新值赋给Person类的Name属性,从而触发Name属性的set方法。这样,数据模型中的Name属性就会被更新,从而保持与UI元素的同步。 需要注意的是,如果绑定的Mode属性设置为OneWayToSource,那么只有当目标属性的值发生变化时,才会触发源属性的set方法。这种情况下,数据模型中的属性只能被UI元素更新,而不能被代码直接修改。
如何使用C#实现绑定呢?
/// <summary> /// Set Binding:将source中的path属性和界面控件obj的p属性绑定在一起,绑定方式默认未双向绑定,绑定时的数据转换器默认为null /// </summary> /// <param name="source">Source Object</param> /// <param name="path">Dependency Property Name of Source</param> /// <param name="obj">Target Object</param> /// <param name="p">Dependency Property of Target</param> /// <param name="mode"></param> /// <param name="converter"></param> public static void SetBinding(object source, string path, FrameworkElement obj, DependencyProperty p, BindingMode mode = BindingMode.TwoWay, IValueConverter converter = null) { Binding b = new Binding(); b.Source = source; b.Path = new PropertyPath(path); b.Mode = mode; b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; b.Converter = converter; obj.SetBinding(p, b); }
调用方式:
SetBinding(dataContext, "Name", myText, Text);