概要:

将所有的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. iOS:翻页效果

    // // main.m // Hello // // Created by lishujun on 14-8-28. // Copyright (c) 2014年 lishujun. All rig ...

  2. http server v0.1_http_webapp.c

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...

  3. Ubuntu版本介绍

    转自Ubuntu版本介绍 经常有人问起Ubuntu的版本选择问题,论坛中虽有帖子提及,但不是很详细,不集中,我就尝试把Ubuntu上的这点东东翻译一下,供大家参考,水平有限,敬请包涵.指正.  Ubu ...

  4. Prefixes and Suffixes

    Codeforces Round #246 (Div. 2) D:http://codeforces.com/contest/432/problem/D 题意:给你一个长度不超过10^5的字符串.要你 ...

  5. 如何通过js使搜索关键词高亮

    给你推荐通过jquery来实现高亮关键词.jquery.textSearch-1.0.js代码: (function($){ $.fn.textSearch =function(str,options ...

  6. astyle基本功能介绍

    astyle是一个命令行工具,语法格式如下 astyle [options] < original > 例如: astyle --style=ansi foo.cpp 上面的命令将美化fo ...

  7. java学习面向对象之抽象类

    什么是抽象类,之所以说抽象就是具体的反义词喽~抽象离我们最近的距离也就是初中的时候学过的美术课,抽象画派.拿一桶画彩就这么往画布上一泼,那就是抽象.那么java世界当中什么是抽象呢?我们再拿动物还有狗 ...

  8. poj3294

    首先后缀数组预处理然后二分答案len很显然,然后考虑怎么判定我们用左右指针顺着名次扫描一下,初始左右指针为1根据LCP(i,j)=min(height[rank[i]+1]~height[rank[j ...

  9. MYSQL删除以数字开头的字段

    例子: // 删除以0开头的字段 DELETE FROM `week_energy_copy` WHERE openid like '0%'; // 删除以数字开头的字段 DELETE FROM `w ...

  10. HDOJ/HDU 2552 三足鼎立(tan()和atan()方法)

    Problem Description MCA山中人才辈出,洞悉外界战火纷纷,山中各路豪杰决定出山拯救百姓于水火,曾以题数扫全场的威士忌,曾经高数九十九的天外来客,曾以一剑铸十年的亦纷菲,歃血为盟,盘 ...