目录

一 上章回顾 

二 实现INotifyPropertyChanged接口

三  属性变更委托

四 属性变更

1  委托会将通知该属性绑定的控件,并传递新属性值,更新UI显示

2 参数设置为返回成员名特性的字符串,该特性会自动返回调用该方法的成员名称,如属性、方法等

五 设置属性

1 方法介绍

2 按引用传递参数

3 返回成员名特性

4 如果值相等,不进行任何更改

5 如果值不等,更新该属性,调用属性变更方法

六 总结

七 下章预告


一 上章回顾 

一 MateralDesign特点

二 MateralDesign介绍

三 导航链接类

四 总结

五 下章预告


二 实现INotifyPropertyChanged

public abstract class ViewModelBase : INotifyPropertyChanged

三  属性变更委托

public event PropertyChangedEventHandler? PropertyChanged;

四 属性变更

1  属性变更

委托会将通知该属性绑定的控件,并传递新属性值,更新UI显示

protected void OnPropertyChanged([CallerMemberName] string? propertyName = null)

=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

2 返回成员名特性

参数设置为返回成员名特性的字符串,该特性会自动返回调用该方法的成员名称,如属性、方法等

[CallerMemberName] string? propertyName = null

五 设置属性

1 方法介绍

传入后备字段和设置值并自动获取调用成员名称后,先判断对象是否相等,不相等更新值,并触发属性变更通知,返回true

protected virtual bool SetProperty<T>(ref T member, T value, [CallerMemberName] string? propertyName = null)
{
    if (EqualityComparer<T>.Default.Equals(member, value))
    {
        return false;
    }

    member = value;
    OnPropertyChanged(propertyName);
    return true;
}

2 按引用传递参数

意味着在方法内部对参数的修改会反映到调用方法的变量上,有两个主要注意事项:传入参数之前必须赋值,并且在调用方法时必须显式使用 ref 关键字

3 返回成员名特性

参数设置为返回成员名特性的字符串,该特性会自动返回调用该方法的成员名称,如属性、方法等

[CallerMemberName] string? propertyName = null

4 如果值相等,不进行任何更改

if (EqualityComparer<T>.Default.Equals(member, value))
    {
        return false;
    }

5 如果值不等,更新该属性,调用属性变更方法

member = value;
    OnPropertyChanged(propertyName);
    return true;

六 总结

以上就是MaterialDesign中ModelViewBase类的介绍,本文仅仅简单介绍了ModelViewBase的作用,而实际使用时可以扩展到各种丰富功能的视图模型,只需要新建类继承该接口,均实现通知属性变更功能,双向绑定UI后,可自动即使更新UI显示,非常便捷高效。


七 下章预告

下一章我会教大家如何创建示范项目DemoItem类,并实现通知属性变更功能,与UI控件元素进行双向绑定后,属性变更时将会自动实时更新UI显示


博主RaymondLeigh:如果您觉得本文为您提供了结局思路或解决了您的实际问题,麻烦您🙏帮忙点赞、收藏、评论、关注一键四连,您的举手之劳将为我写作提供动力源泉!🤞

print('Hello,RaymondLeigh!')  # 每日问候,跟大家问好!


🔥精品C#框架专栏:Prism合集 WPF合集


🌞精品前端MaterialDesign专栏:MaterialDesign专栏


💾精品后端SqlServer专栏:SqlServer专栏


💻精品程序开发专栏  VisualStudio专栏

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐