mvvm和函数柯里化

MVVM架构模式和函数柯里化 Object相关静态方法

1.MVVM架构模式

2.函数柯里化

01-MVVM架构模式【重点】

`概念`MVVM是一种架构/设计模式。 MVVM是Model,View和ViewModel的简称

	Model: 模型层。 提供数据
    View: 视图层。 渲染页面
    ViewModel: 视图模型层 连接模型层和视图层的桥梁
    
 `核心`:实现了数据的双向绑定。数据驱动视图:当数据发生变化,视图会自动更新。
 
 `Object.defineProperty()实现MVVM架构`:
  <div id="app"></div>

    <script>
        // MVVM核心:数据的双向绑定,数据驱动视图

        // Model: 模型层  提供数据
        var model = {
   
   
            uname: '小妲己'
        }

        // ViewModel: 视图模型层  连接模型层和视图层
        /* 
            考虑:1. 什么时候访问了数据;2. 什么时候更新了数据
        */
        // 数据劫持
        var _uname = model.uname
        Object.defineProperty(model, 'uname', {
   
   
            get: function () {
   
   
                // 当访问了被监听的属性时触发
                console.log(new Date(), 'uname属性被访问了');
                // 注意:这里不能返回被监听的属性,否则会一直触发get方法,变成死循环
                // 解决:可以在劫持之前,将被监听的属性赋值给另一个临时变量
                return _uname
            },
            set: function (newVal) {
   
   
                // 当修改了被监听的属性时触发
                console.log(new Date(), 'uname属性被修改了', newVal);
                // 修改模型层的数据
                _uname = newVal
                // 通知视图层更新
                watch()
            }
        })


        // View: 视图层 渲染页面
        function render() {
   
   
            app.innerHTML = `<span>${
     
     model.uname}</span><button onclick="changeUname()">戳我呀~</button>`
        }

        render()

        function changeUname() {
   
   
            // 修改了被监听的属性,会触发set方法
            model.uname = '小貂蝉'
        }

        function watch() {
   
   
            render
在 .NET MAUI 中使用 MVVM 模式初始化 Popup 控件时,最佳实践包括以下几个方面,以确保控件的绑定上下文正确传递、资源正确加载以及逻辑处理的可维护性。 ### 1. 显式设置 Popup 控件的绑定上下文 Popup 控件不会自动继承父页面的 `BindingContext`,因此在实例化 Popup 时应显式设置其 `BindingContext`,以确保绑定路径正确解析。这样可以避免因绑定失败导致的运行时异常。 ```csharp var popup = new MyPopup { BindingContext = this.BindingContext }; ``` 这种方式确保 Popup 中的绑定路径能够正确地与 ViewModel 中的属性对应,特别是在使用 `CommunityToolkit.Maui` 提供的 Popup 控件时尤为重要[^1]。 ### 2. ViewModel 中的属性实现 INotifyPropertyChanged 为了支持 MVVM 模式下的数据绑定,ViewModel 中的属性必须实现 `INotifyPropertyChanged` 接口。例如,若 Popup 的背景色依赖于 ViewModel 中的 `Brush` 类型属性,应确保该属性在值更改时触发 `PropertyChanged` 事件。 ```csharp public class MyViewModel : INotifyPropertyChanged { private Brush _background; public Brush Background { get => _background; set { if (_background != value) { _background = value; OnPropertyChanged(nameof(Background)); } } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` 通过这种方式,Popup 控件可以响应 ViewModel 中背景属性的变化,并自动更新 UI[^1]。 ### 3. 使用资源字典定义样式颜色 在 `App.xaml` 或页面资源中定义全局或局部资源,可以避免因资源未定义或加载顺序错误导致的异常。例如,定义一个用于 Popup 背景色的资源: ```xml <Application.Resources> <Style TargetType="toolkit:Popup"> <Setter Property="Background" Value="#FFD700" /> </Style> </Application.Resources> ``` 这样可以确保 Popup 在初始化时能够正确加载资源,避免因资源缺失导致的异常。 ### 4. 在 Popup 的 Appearing 事件中执行初始化逻辑 由于 Popup 控件的初始化可能早于资源加载或绑定上下文的完全设置,建议在 `Appearing` 事件中执行与 UI 相关的逻辑,如动态设置背景色。 ```csharp public partial class MyPopup : Popup { public MyPopup() { InitializeComponent(); this.Appearing += OnAppearing; } private void OnAppearing(object sender, EventArgs e) { this.Background = (Brush)Application.Current.Resources["CustomBackground"]; } } ``` 这种方式可以确保控件在显示前已完成必要的初始化操作[^1]。 ### 5. 避免在构造函数中执行复杂绑定操作 Popup 控件的构造函数中应避免执行依赖于绑定或资源的操作,因为此时控件可能尚未完全初始化。应将此类逻辑推迟到 `Appearing` 或其他合适的生命周期事件中执行。 ### 6. 使用硬编码值进行测试 在调试过程中,为排除绑定逻辑问题,可先在 XAML 中直接设置 Popup 的背景色,以确认是否是绑定逻辑问题: ```xml <toolkit:Popup Background="#FFD700"> <!-- Popup content --> </toolkit:Popup> ``` 这种方式有助于快速定位问题根源。 ### 示例代码 ```csharp var popup = new MyPopup { BindingContext = this.BindingContext, Background = Brushes.LightBlue }; await Shell.Current.ShowPopupAsync(popup); ``` 该示例展示了如何在 MVVM 模式下正确初始化 Popup 控件,并设置背景色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值