当前位置: 代码网 > it编程>编程语言>Asp.net > WPF框架Prism中ViewModelLocator用法介绍

WPF框架Prism中ViewModelLocator用法介绍

2024年05月19日 Asp.net 我要评论
建立连接在wpf当中,需要为view与viewmodel建立连接, 我们需要找到view的datacontext, 如下所示:建立连接的方式如果你使用了解wpf当中如何绑定datacontext, 你

建立连接

在wpf当中,需要为view与viewmodel建立连接, 我们需要找到view的datacontext, 如下所示:

建立连接的方式

如果你使用了解wpf当中如何绑定datacontext, 你应该能想到会有下面这些方式进行:

  • xaml设置
  • code设置 (构造函数注入 或 viewmodellocator)

xaml的方式:

 <usercontrol.datacontext>
        <.../>
 </usercontrol.datacontext>

代码的方式:

    public partial class viewa : usercontrol
    {
        public viewa()
        {
            initializecomponent();
            this.datacontext = null; //设定
        }
    }

如果你使用过第三方的mvvm框架, 标准的viewmodellocator可能如下所示:

嗯...确实,这些方式都可以建立view-viewmodel关系。

但是,这一切并不是prism想表达的内容, 甚至不建议你按上面的方式去做, 因为这样几乎打破了开发的所有原则。

(我们把view与viewmodel的关系编码的方式固定了下来, 通过静态类去维护viewmodel的关系...)

prism viewmodellocator

在prism当中, 你可以基于命名约定, 便能够轻松的将view/viewmodel建议关联。如下所示:

假设你已经为项目添加views/viewmodels文件夹。此时, 你的页面为viewa, 则对应的viewmodel名称为 viewaviewmodel。

下面则是错误的命名方法:

当遵循了命名规范后, 是不是意味着就能够进行自动绑定? 不, 此时还需要在view当中声明,允许当前view自动装配viewmodel:

细心的你会发现, 这也就是为什么, 使用visualstudio tmeplate pack创建的空白项目的时候, 为什么项目会为你默认创建views/viewmodels文件夹。

当然, 任性的我们也可以选择不遵循这个约定, 尽管它看起来似乎也能够很好的进行工作...

更改约定

实际的开发中, 我们可能有些清空无法遵循此规则, 如下所示,我们定义controls文件夹放view, viewmodels文件夹放viewmodel:

修改方式:

1.使用viewmodellocationprovider设置默认视图类型指定的viewmodel。

viewmodellocationprovider.setdefaultviewtypetoviewmodeltyperesolver((viewtype) =>
            {
                var viewname = viewtype.fullname;
                var assemblyname = viewtype.assembly.fullname;
                var vmname = $"{viewname.replace("controls", "viewmodels")}viewmodel, {assemblyname}";
                return type.gettype(vmname);
            });

该代码的最终意思就是,将原有的view命名控件命名改成了符合约定的命名。

2.使用viewmodellocationprovider指定view与viewmodel的类型。

        public void registertypes(icontainerregistry containerregistry)
        {
            viewmodellocationprovider.register<controla, controlaviewmodel>();

            //viewmodellocationprovider.register<controla>(() => new controlaviewmodel() { text = "hello from factory" });
        }

到此这篇关于wpf框架prism中viewmodellocator用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com