我们的应用程序是一个包含许多模块和视图的大型项目主窗口中有一个功能区,我们正在寻找在功能区中集成功能区的最佳方法.

我创建了一个服务模块,视图可以注册以添加与它们相关的功能区项目,此外,任何主视图实例都可以提供与该实例相关的自己的功能区项目.一个RibbonItem是一个小类,它抽象一个功能区项的选项,主要有Title,Description,Command,UIType和ChildItems.当主视图发生变化时,该服务负责重建功能区.

我的一位同事认为这是糟糕的MVVM,因为用户需要在C#代码而不是XAML中设计他们的功能区视图,他还说这样做很难使一组项目被禁用或立即启用,如这些项目的每个命令都需要单独更新其CanExecute.相反,他建议使用主要的Ribbon View和viewmodel文件,其中每个想要为其模块或视图添加功能区按钮的开发人员需要在View XAML中添加它们,并在viewmodel中添加相关命令.此外,VisualStates将用于根据viewmodel中的更改(例如视图更改或选择更改)确定要显示或启用的项目.我真的不喜欢这个解决方案,主要是因为所有开发人员都必须将他们的模块知识放在一次大文件中.

请注意,功能区中的某些项目(例如,选项,退出)对整个应用程序是通用的,而某些项目与特定应用程序域相关,而某些项目仅与特定视图相关.

编辑:我想我的主要问题是允许多个开发团队集成在一个功能区上的推荐方法是什么?我们是否应该有一个RibbonView和一个Ribbonviewmodel,它将包含功能区中的所有可能项目,每个团队都会将其项目添加到这些V / VM,并定义何时显示它们的逻辑(可能通过使用可视状态) ?或者我们是否允许每个视图,视图模型或模块在服务中注册功能区项目(在他们自己的C#代码中),然后让服务在活动视图随注册到该类型的所有项目更改时根据需要呈现功能区?或者有没有更好的方法来实现这种集成?

你怎么看?
您是否对如何管理多个开发人员常见的单个功能区资源有更好的想法或意见?

谢谢,
splintor

我同意Will的评论,你的视图模型不应该关心或知道它是如何呈现的,或者设计师是否决定改变它的呈现方式.

viewmodel应该只包含表示层渲染它所需的所有信息.

因此,viewmodel应该具有Ribbon栏需要绑定的所有属性才能运行.然后,您可以使用Resources.xaml或其他策略来呈现它.

在黑暗中拍摄我会为viewmodels尝试这样的事情:

public interface IMenuviewmodel : INotifyPropertyChanged
{
  ICommand Command {get;}
  string Title {get;}
  string Description {get;}
  UIType Type {get;}
  IList<IMenuviewmodel> ChildItems {get;}
}

然后,我可能会创建一个抽象类,它为实现INotifyPropertyChanged提供了一个集合类,它实现了INotifyCollectionChanged来处理管道代码.

我可能会在Resources.xaml中做类似的事情

<DataTemplate DataType="{x:Type vm:IMenuviewmodel}">
  <StackPanel>
    <Button Command="{Binding Command}" Content="{Binding Type}"/>
    <ItemsControl ItemsSource="{Binding ChildItems}"/>
  </StackPanel>
</DataTemplate>

为您的视图模型提供默认视图

然后所有人必须做的是在你的功能区栏中创建一个条目

1)实现IMenuviewmodel

2)如果他们希望他们的小部件呈现方式不同,可以选择将另一个DataTemplate条目添加到resources.xaml中:

<DataTemplate DataType="{x:Type vm:Fooviewmodel}">
    <v:FooView />
</DataTemplate>

我希望我没有深入研究如何实施.

重点是viewmodel应该只公开视图所需的属性来完成它的工作(这是渲染viewmodel),而不是viewmodel来完成工作或者关心它是如何完成的.

wpf – 使用Microsoft(或其他)功能区与大型项目和MVVM的更多相关文章

  1. Swift教程17-淡化MVC,使用MVVM框架开发轻巧便于维护的iOS/android app

    MVVM是微软提出一种移动开发框架,旨在针对传统的MVC框架,解决传统的MVC框架的控制器的臃肿问题.M:Model模型,也就是数据模型;比如一条微博,对应的所有字段合成一条微博整体,这个整体就是ModelV:View视图,只用来显示的视图,如iOS的UIView,Cell;当然在iOS中Storyboard中,view总是和控制器关联,这并不是严格的view如果我们纯手写代码定义一个view那么

  2. Swift 2.0 下面向协议的MVVM架构实践

    本文由CocoaChina译者lynulzy翻译原文:Swift2.0:Protocol-OrientedMVVM自从令人兴奋的[《面向协议的编程方法》]在Swift的WWDC大会上发布以来。我已经在之前的博客中使用过MVVM架构,如果你想了解更多MVVM相关知识请参考[这里]。接下来我将讲解,如何添加面向协议。switchToggle.onTintColor=switchColorself.onSwitchToggleHandler=onSwitchToggleHandler虽然在这种情况下看起来并不是

  3. Swift教程17-淡化MVC,使用MVVM框架开发轻巧便于维护的iOS app

    overridefuncawakeFromNib(){super.awakeFromNib()}overridefuncsetSelected{super.setSelected}/***配置Cell的内容方法*/funcconfigCellWithStatusModel(model:StatusModel!){self.imageView2.setimageWithURL;background-color:inherit">placeholderImage:UIImage)self.textLabel2

  4. Swift开发黑科技:还在争论MVC和MVVM?现在你应该试试MVP!

    我下定决心重构自己的代码,下面步入正题,结合Swift开发大会的一些分享,让我们谈谈架构。现在数据工程里面的目录是这样的:模型代码:为了简单我都使用了String类型的数据,至于为什么要使用struct而不使用class,大家可以参考WWDC2015的414号视频,讲的非常清楚,我自己的项目中的数据模型已经全部转成struct了,我会在后面专门写博文讲解struct,这里就不赘述了。

  5. MVVM 不是那么好

    我觉得MVVM是一种反人类的设计模式,它使架构更加混乱而非清晰。MVVM命名很糟糕名称是很重要的。ViewModel这一名称则没有发挥任何作用。ViewModel的第一种含义是modelfortheview。MVVM引进太多职责命名不够具体,导致这个类的任务无休止地增长。MVVM不改变你的架构viewmodel并不能从根本上改变你的应用程序的架构。我能想到的MVVM模式最大的好处就是它把“下水道”从苹果自带的viewcontrooller类转移到了viewmodel这一自定义的对象。

  6. Swift学习第十一枪-基于协议的MVVM模式的实现

    下面是我的新建的Swift学习交流群,欢迎大家一起来共同学习Swift。不管是IOS还是Android,就三种常用模式,MVC,MVP,MVVM网上的资料非常之多,对于MVVM大家估计都有所了解,我在这里就简单的以图示的形式给大家展示。

  7. 关于MVVM的理解

    MVVM中VM到底是个什么角色?MVVM简介关于MVVM,相信大家或多或少都有了解。引用MVVM介绍文中一图受MVC或MVP架构的影响,对MVVM最初印象以为这是一个以viewmodel为核心,处理View和Model的开发架构。于是乎在原有MVC的基础上,创建了一个所谓的viewmodel对象,然后把ViewController中的代码移到viewmodel中,在viewmodel里面处理View以及Model的所有逻辑。完整结构如图所示Model并不表示ModelMVVM架构中的M,并不表示Model

  8. WPF listview / gridview性能可怕,建议

    解决方法检查这些属性:

  9. 在WPF中ListView和GridView有什么区别?

    我正在尝试创建一个WPF数据库应用程序.我可以使用一些好的组件来显示数据库表中的数据.ListView和GridView似乎很受欢迎.但对于新手来说,很难看出它们之间的区别.ListView和GridView有什么区别?优缺点都有什么?

  10. android – MVVM Dagger2与组件中存在匹配键的绑定

    我正在使用以下谷歌示例项目:https://github.com/googlesamples/android-architecture-components作为我的新项目的参考,并且难以尝试向项目添加第二个活动.这是编译时遇到的错误这是我的代码ActivityModuleAppComponentAppInjector的AppModuleFragmentBuildersModule注射viewmod

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部