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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值