zoukankan      html  css  js  c++  java
  • 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时可以共享数据。

  • 相关阅读:
    回归,随缘写一些python心得吧
    划分树【有些东西,其实自己还不太会也要忍住把*装完】
    [codevs3273]两圆的交 计算几何
    10-12考试整理
    10-7考试整理
    [codevs1163]访问艺术馆
    [codevs2640]打印页数
    9-28 解题报告
    [CODEVS3323]时空跳跃者的封锁
    [codevs2442] kshort 经典题
  • 原文地址:https://www.cnblogs.com/jianyi0115/p/2074992.html
Copyright © 2011-2022 走看看