[TOC]
高内聚UI-低耦合逻辑
;DispatcherObject类
DispatcherObject是后台线程和前台线程的架海紫金梁,虽然所有的控件都必须在前台UI线程中创建,但是在开发过程中,难免需要在后台线程中去操作控件,于是Dispatcher调度员提供了Invoke和BeginInvoke两个方法,供我们可以安全的访问UI线程中的控件。
数据存储层
,使用数据库和文件系统;数据处理层
,使用ADO.NET等技术;数据展示层
,使用WPF类库;INotifyPropertyChanged
接口;
{Binding Path=属性名}
的方式绑定;//简化写法
this.textName.SetBinding(TextBox.TextProperty, new Binding("Name"))
{
Source = this.data,
Mode = BindingMode.TwoWay,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
};
BindableBase类
简化数据绑定;
INotifyPropertyChanged
接口的对象;ElementName
指向控件的名称即可;
ObjectDataProvider
作为数据源;DataContext作为一个依赖属性,可以沿着UI树从根向上传递,并被所有子控件继承;
Binding的四种模式
- BindingMode.OneWay单向绑定;
- BindingMode.TwoWay双向绑定;
- BindingMode.OneWayToSource单向到源;
- BindingMode.OneTime一次绑定;
创建ValidationRule抽象类的派生类,实现Validate方法;
若校验通过,则返回ValidationResult.ValidResult;
否则将ValidationResult.IsValid=false,并设置ErrorContent属性为错误信息;
什么时候确定校验
Binding只有在Target 被外部方法更新时校验数据,例如TextBox控件的Text属性绑定时,只有在用户输入完成后失去焦点时才会校验数据,这是为了校验来自Target的数据;
若想要校验来自Source的数据,则需要将校验条件的ValidatesOnTargetUpdatad=True
;
校验失败的异常捕获
IValueConverter
接口的类必须包含两个方法:Convert
(Source to Target)和ConvertBack
(Target to Source); public class GenderEnumToListConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
// 忽略传入的值,直接返回枚举值的列表
return Enum.GetValues(typeof(GenderEnum));
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
// 尝试将选中的值转换回GenderEnum枚举值
if (value is string enumString)
{
if (Enum.TryParse<GenderEnum>(enumString, out var enumValue))
{
return enumValue;
}
}
// 如果转换失败,返回枚举的默认值
return GenderEnum.Unknown;
}
}
MultiBinding
元素,并通过Bindings
子元素指定每个绑定的详细信息;首先介绍CLR属性
;
Property
;
实例属性
的形式向外界暴露依赖属性,这样依赖属性才能成为数据源的一个Path;
SetValue
方法时,值被存储到哪里?
因为依赖对象的依赖属性是 public static readonly 修饰的,所以值不可能保存到实例对象中,不然几百个实例都赋值时就乱了;CLR直接事件模型
中,事件的拥有者就是消息的发送者(sender);
UIElement
都具备AddHandler
方法;```
{StaticResource}
标记扩展语法;{DynamicResource}
标记扩展语法;RunWorkerAsync
(输入);
DoWorkEventArgs.Argument与Result
RunWorkerCompleted
(object sender, RunWorkerCompletedEventArgs e);