WPF MVVM模式动态加载用户控件的问题

问题描述

有这样一个场景,主窗体(MainWwindow)上有4个Button,点击每个Button都会加载一个UserControl(关闭正在打开的)每个UserControl绑定了自己的ViewModel那么MainWindow的ViewModel里,用什么方式加载UserControl?最好是不要在MainWwindow.cs里写代码;

解决方案

解决方案二:
写一个方法根据点击不同的button返回不同的UserControl。
解决方案三:
引用楼主qq_25876223的回复:

有这样一个场景,主窗体(MainWwindow)上有4个Button,点击每个Button都会加载一个UserControl(关闭正在打开的)每个UserControl绑定了自己的ViewModel那么MainWindow的ViewModel里,用什么方式加载UserControl?最好是不要在MainWwindow.cs里写代码;

这是不可能的。ViewModel跟UI没有非常直接的关系,动态加载用户控件的动作必须是V的职责。在ViewModel层,它只应该管理“状态值”,例如当前应该显示什么界面的这个名称而已,而动态加载用户控件则应该是写在V的。不是所有的东西都可以理论化,任何一种设计模式永远都会存在着“灰色地带”,只不过这种东西要少用到“恰好合适”的程度,而如果强调要“根本不用”反而是成事不足败事有余的。
解决方案四:
当我们使用几十个现成的应用控件时,我们可以采用MVVM方式来将控件的“属性”与业务模型进行双向绑定。但是假设我们现成的控件不够用的时候,需要比较深入的技术的时候,那么传统的技术不能丢掉。不是什么层次都用MVVM的。

时间: 2024-08-02 20:39:38

WPF MVVM模式动态加载用户控件的问题的相关文章

另类的动态加载用户控件

在BS架构这块,我们平时建一个网站,通常是创建一个WebSite网站,或者是创建一个WebApplication.然后在WEB项目里面建立相应的aspx文件,以及用户控件,自定义控件等等.但是做为一个新加入此项目的你要去修改里面的 某一个功能模板,那么我一般的程序是这样的: 第一:根据新的需求,在项目找到相关页面,例如对应的页面URL为index.aspx.此时可以对原页面做最初的了解. 第二:分析代码. 第三:根据新的需求来修改代码. 我想这也是一般朋友的思维模式吧.可是这样的流程并不是统一不

动态加载用户控件的组件!

动态|加载|控件 我们写用户控件的目的就是放到页面中去.根据不同的条件,我们可以改变加载的用户控件! 其实原理就是MasterPage的原理.这个MasterPage会在vs2005中提供,但是现在也可以实现. 在我的项目中就用到: MasterPage就四个类,其中容器就动态加载用户控件.这种功能在vs2005中将无处不在. 下面简单介绍一下动态加载叶面组件: 我们只需要改变用户组件的地址就可以动态改变加载的用户组件了. 在程序中动态改变SkinPath就可以了. 组件源码如下: using

动态加载用户控件的组件

动态|加载|控件 动态加载用户控件的组件!(终结MasterPages技术) 让我们来做个页面模版吧!有了模版是不是就可以统一了呢!Sure ! 比如:模版页Template.ascx中我们留出中间一个部分,或者你想要留出的一个空间,让以后放入你想要的内容. 好了!那么在我们的页面index.aspx上我们就可以引用这个Template.ascx,然后在空出的部分放入我们特别的东西,当然最好是在空的地方我们插入另外一个页面如:List.ascx, 当然我们在做个页面MyArchive.aspx.

动态加载用户控件的组件!(三)

动态|加载|控件 上一篇文章写到动态加载用户控件的简单应用 页面是用来浏览信息的!但是更重要的是和用户交互,根据不同的需求提供不同的内容服务,这是一种服务或是一种更贴近用户的人性化.(又在胡言乱语了!^_^) 动态加载叶面,根据不同的用户权限加载不懂的内容服务.根据用户的相应加载相应的内容服务. 还有另外一个应用就是做到页面与代码的分离.在vs2003里,一般ascx或aspx文件,在刚建立的时候都直接跟一个cs文件关联.那么我们在写程序的时候就不能分开来做.作叶面和写后台代码的不能分开.为了能

动态加载用户控件至DataList并为用户控件赋值实例演示_实用技巧

为了实现这个演示,Insus.NET使用通用的新闻例子,它类别(目录)以及文章.在一个页面,显示所有类别,每个目录下显示最新几条新闻. 效果如下: 目录是用DataList控件显示,而文章标题列表是一个用户控件显示,这个用户控件将动态被加入至DataList. 复制代码 代码如下: View Code <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_Item

asp.net动态加载用户控件,关于后台添加、修改的思考_实用技巧

看下下面这个典型的后台(比较粗糙):说实在,我很厌倦全部用.aspx文件去做,比如"友情连接"这个模块,就有"添加友情连接""修改友情连接""友情连接列表",简单的话,可以把"添加""修改"合成一个文件.每次都去建立一个.aspx文件.我现在的想法是用"用户控件+配置文件"去实现,虽然文件数目可能不会少很多.但在编程到一定地步,我想大家会有跟我一样的想法. 首先需要涉

ASP.NET动态加载用户控件的实现方法_实用技巧

第一步:例如用户控件放在MyList.Ascx,然后其Control指令是: 复制代码 代码如下: <%@ Control Language="C#" AutoEventWireup="true" CodeFile="ViewComment.ascx.cs" Inherits="Control_ViewComment"%> 这时候已经有了Inherits,自带了ClassName就是其名称,如果没有,则必须创建Cl

动态加载用户控件的组件!(二)

动态|加载|控件 上一篇文章写到了动态加载用户组件的组件. 但是怎样灵活的在项目中运用呢?怎样做到面向组件的开发呢?就像是积木式开发,我们的叶面可以有不同的组件来完成,而整个叶面就是一个容器,我们只不过是往容器里添加不同的元素而已,因此只要我们的元素能够做到通用,一般化,那么元素积累到了一定的程度,元素足够的丰富就可以经而一举构造出我们想要得叶面. 更多地运用到下一篇文章再详细到来.下面我们先来看看怎么样加载组合我们的用户组件: 1.让我们来先做两个元素,这里我就把用户组件ascx的文件称之为元

掉掉注意了,如何动态加载用户控件(ascx)

动态|加载|控件 注: 本方法是我同事李强原创 步骤一: 把ascx控件拖入设计窗口,然后转入html模式,保留定义如果你需要多个ascx的话,请全部拖入.但是把相应的内容删除.(因为我们需要动态加载)在需要填入控件的地方,放个容器,比如td,并设定在服务器端运行如    <TD  id="tdpan" runat=server></TD> 2:动态调用UserControl myusercontrol = (UserControl) LoadControl (