MVVM之View和ViewModel的关联

概要:

将所有的VM在加载到Application的Static Resource中,然后在View中用标签指定。

实现:

1)采用特性指定要添加到StaticResource中的对象

publicclassStaticResourceAttribute : Attribute
    {
        publicstringKey { get; set; }
  
        publicStaticResourceAttribute(stringkey)
        {
            this.Key = key;
        }
    }

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];
            else
                returndefault(T);
        }
    }

在主窗体中调用:

publicpartialclassMainPage : UserControl
    {
        publicMainPage()
        {
            ViewModelManager.InjectViewModelsToResources();
              
            InitializeComponent();         
        }
    }

3)View写法

<UserControlx:Class="XXX .LoginView"
 <UserControl.DataContext>
        <BindingSource="{StaticResource LoginViewModel}"/>
    </UserControl.DataContext>
  
  
</UserControl>

结论:

这样处理后,实现了VM的"单例",多个View关联同一个VM时可以共享数据。

原文地址:https://www.cnblogs.com/luluping/p/2077218.html