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的关联的主要内容,如果未能解决你的问题,请参考以下文章
如何从 View 和关联的代码隐藏文件中访问我的 ViewModel?