• 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时可以共享数据。

  • 相关阅读:
    搭建WAP应用开发环境
    How To Recover Openfire admin Password
    Domino分区服务器的安装与设置
    apache安全加固
    apache的web文件根目录
    iis绑定域名
    dedecms出现Error: Errno:0 SQL::错误解决方法
    加入收藏兼容ie和火狐
    phpcms毛遂
    .htaccess文件
  • 原文地址:https://www.cnblogs.com/jianyi0115/p/2074992.html
Copyright © 2020-2023  润新知