概要:
将所有的VM在加载到Application的Static Resource中,然后在View中用标签指定。
实现:
1)采用特性指定要添加到StaticResource中的对象
publicclassStaticResourceAttribute : Attribute |
publicstringKey { get; set; } |
publicStaticResourceAttribute(stringkey) |
2)从当前的程序集中,把所有标记了StaticResourceAttribute的VM加载到AppResource中
publicclassViewModelManager |
privatestaticApplication app = Application.Current; |
publicstaticvoidInjectViewModelsToResources() |
Assembly executingAssembly = Assembly.GetCallingAssembly(); |
foreach(Type type inexecutingAssembly.GetTypes()) |
var attributes = type.GetCustomAttributes(false); |
foreach(var attribute inattributes) |
if(attribute isStaticResourceAttribute) |
var obj = Activator.CreateInstance(type); |
if(!app.Resources.Contains(type.Name)) |
app.Resources.Add(type.Name, obj); |
publicstaticT GetViewModelFromResources<T>() |
var key = typeof(T).Name; |
if(app.Resources.Contains(key)) |
return(T)app.Resources[key]; |
在主窗体中调用:
publicpartialclassMainPage : UserControl |
ViewModelManager.InjectViewModelsToResources(); |
3)View写法
<UserControlx:Class="XXX .LoginView"〉 |
<UserControl.DataContext> |
<BindingSource="{StaticResource LoginViewModel}"/> |
</UserControl.DataContext> |
结论:
这样处理后,实现了VM的"单例",多个View关联同一个VM时可以共享数据。