MVVM之View和ViewModel的关联

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVVM之View和ViewModel的关联相关的知识,希望对你有一定的参考价值。

概要:

将所有的VM在加载到Application的Static Resource中,然后在View中用标签指定。

实现:

1)采用特性指定要添加到StaticResource中的对象

 

public class StaticResourceAttribute : Attribute
    {
        public string Key { get; set; }
 
        public StaticResourceAttribute(string key)
        {
            this.Key = key;
        }
    }

 

2)从当前的程序集中,把所有标记了StaticResourceAttribute的VM加载到AppResource中

 

public class ViewModelManager
    {
        private static Application app = Application.Current;
 
        public static void InjectViewModelsToResources()
        {
            Assembly executingAssembly = Assembly.GetCallingAssembly();
            foreach (Type type in executingAssembly.GetTypes())
            {
                var attributes = type.GetCustomAttributes(false);
 
                foreach (var attribute in attributes)
                {
                    if (attribute is StaticResourceAttribute)
                    {
                        var obj = Activator.CreateInstance(type);
                        if (!app.Resources.Contains(type.Name))
                            app.Resources.Add(type.Name, obj);
                    }
                }
            }
        }
 
        public static T GetViewModelFromResources<T>()
        {
            var key = typeof(T).Name;
            if (app.Resources.Contains(key))
                return (T)app.Resources[key];
            else
                return default(T);
        }
    }

 

在主窗体中调用:

 

public partial class MainPage : UserControl
    {
        public MainPage()
        {
            ViewModelManager.InjectViewModelsToResources();
             
            InitializeComponent();        
        }
    }

 

3)View写法

 

<UserControl x:Class="XXX .LoginView"〉
 <UserControl.DataContext>
        <Binding Source="{StaticResource LoginViewModel}"/>
    </UserControl.DataContext>
 
 
</UserControl>

 

结论:

这样处理后,实现了VM的"单例",多个View关联同一个VM时可以共享数据。

以上是关于MVVM之View和ViewModel的关联的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - MVVM之ViewModel

什么是mvvm?

如何从 View 和关联的代码隐藏文件中访问我的 ViewModel?

Android基础——框架模式MVVM之DataBinding的实践

Vue和MVVM对应关系

Prism程序入口View ViewModel关联数据绑定数据校验cmd