概要:

将所有的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的关联的更多相关文章

  1. MVVM模式View和ViewModel的通信

    还需要些什么呢 在前面几篇博客中我们尝试去实现了MVVM中的数据绑定.命令绑定和事件绑定.貌似实现的差不多了.我最早尝试用MVVM去开发的时候也是这么想的,没有用第三方框架,甚至只是实现了数据绑定和命 ...

  2. (二)MVVMLight 关联View和ViewModel

    在我们按照(一)中的步骤,安装好MMVLight的环境后, 会多出一个文件夹ViewModel,里面有两个.cs文件MainViewModel.cs和ViewModelLocator.cs MainV ...

  3. MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

    MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...

  4. js架构设计模式——MVVM模式下,ViewModel和View,Model有什么区别

    MVVM模式下,ViewModel和View,Model有什么区别 Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与数据库对应的model. View:也很简单,就 ...

  5. 从PRISM开始学WPF(五)MVVM(一)ViewModel?

    从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Module? ...

  6. 利刃 MVVMLight 2:Model、View、ViewModel结构以及全局视图模型注入器的说明

         上一篇我们已经介绍了如何使用NuGet把MVVMLight应用到我们的WPF项目中.这篇我们来了解下一个基本的MVVMLight框架所必须的结构和运行模式. MVVMLight安装之后,我们 ...

  7. Unity 3D Framework Designing(3)——构建View和ViewModel的生命周期

    > 对于一个View而言,本质上是一个MonoBehaviour.它本身就具备生命周期这个概念,比如,Awake,Start,Update,OnDestory等.这些是非常好的方法,可以让开发者 ...

  8. MVVM探索:从ViewModel关闭Window的最佳实践

    在WPF里使用MVVM开发的时候,似乎总是不可避免的会遇到这样一个问题:ViewModel在处理完业务之后需要关闭这个Window,这时候要怎么处理? 网上有很多解决方案:有的在ViewModel抛出 ...

  9. Unity应用架构设计(3)——构建View和ViewModel的生命周期

    对于一个View而言,本质上是一个MonoBehaviour.它本身就具备生命周期这个概念,比如,Awake,Start,Update,OnDestory等.这些是非常好的方法,可以让开发者在各个阶段 ...

随机推荐

  1. 面试cookie

    cookie : 存储数据,当用户访问了某个网站(网页)的时候,我们就可以通过cookie来像访问者电脑上存储数据 1.不同的浏览器存放的cookie位置不一样,也是不能通用的 2.cookie的存储 ...

  2. 小记,取GB2312汉字的首字母【转】

    /// <summary> /// PY 的摘要说明. /// </summary> public class PY { // Fields private string m_ ...

  3. Strongly connected

    hdu4635:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个有向图,然后问你最多可以加多少条边,是的原图不是一个强连通图. 题解:这一题 ...

  4. 【转】django的ORM操作数据库样例

    这个算是我看到的大全了,希望可以解决明天我希望解决的两个问题... class Blog(models.Model): name = models.CharField(max_length=100) ...

  5. asp.net 类库中获取session c#类中获取session

    asp.net  类库中获取session c#类中获取session 1. 先引入命名空间 using System.Web; using System.Web.SessionState; 在使用H ...

  6. 内存管理(memory allocation内存分配)

    Memory management is the act of managing computer memory. The essential requirement of memory manage ...

  7. wireshark设置抓服务器的包

    wireshark设置抓服务器的包:

  8. Oracle导出存储过程

    SQL> SELECT * FROM dba_directories ; OWN DIRECTORY_NAME DIRECTORY_PATH ------- ------------------ ...

  9. Oracle imp 不同字符集导入

    有一个dmp文件是US7ASCII字符的,现有数据库是UTF8字符集,按照查到的资料看说是UTF8是US7ASCII超级可以自动转换导入.但是导入的时候某些字段超长,导致一个表导入错误. 解决办法,讲 ...

  10. 贪心(哈夫曼树):HDU 5884 sort

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2QAAAKACAIAAAB8KCy/AAAgAElEQVR4nOy9a5Adx3UmWL+kHxuekU ...