我现在已经有些过时了,现在有兴趣听听人们对Prism最新版本的看法(我之前使用过几个版本),还是MVVM Light + Unity方法(我从来没有这样做过 – 体面的例子url会很好)。 我的项目将是由多个开发人员编写的包含多个模块的大型项目。 也有资金来引入第三方控制套件,以build立一个漂亮的工作空间使用一个漂亮的Docking / Workspace布局pipe理器(我知道一些比其他人更好地发挥Prism区域)。 如果你现在从头开始一个项目,你会怎么做,为什么? 有关具体build议的体系结构模式的详细信息将会很有用(例如,自动发现模块DLL?注入日志logging服务?)。 基本上,任何想法和build议都会很好。 我想讨论一下。 也许你会build议进入另一个方向吗? 我非常在研究阶段,并希望尽可能多的input。 我把这个放在这里是因为我认为它会比Prism / MVVM Light论坛的偏见less一些,但如果这个问题有更合适的地方,请指出我的方向。
我有一个使用GalaSoft MVVM Light框架传递参数到relaycommand的问题。 我知道mvvm light的relaycommand实现不使用lambda参数,所以我做了一些研究,并find了一种方法,人们通过这样做来解决这个问题: public RelayCommand ProjMenuItem_Edit { get { if (_projmenuItem_Edit == null) { //This should work…. _projmenuItem_Edit = new RelayCommand(ProjEditNode); } return _projmenuItem_Edit; } } private void ProjEditNode(object newText) { var str = newText as string; OrganLocationViewModel sel = ProjectOrganLocationView.GetExtendedTreeView().GetTopNode(); //Console.WriteLine(sel.OrganDisplayName); sel.OrganDisplayName = str; } 但是,我不断收到一个错误_projmenuItem_Edit = new RelayCommand(ProjEditNode); 说Argument 1: cannot […]
我喜欢MVVM Light的Messenger以及它的灵活性,但是当我忘记明确注销收件人(在Silverlight 4中)时,我正在经历内存泄漏。 原因在这里解释,但我很好,因为我相信这是一个很好的做法,明确注销收件人,而不是依靠信使的弱引用。 问题在于说起来容易做起来难。 ViewModel很容易:你通常可以完全控制它们的生命周期,并且可以在不再需要的时候Cleanup()它们。 另一方面, 视图更复杂,因为它们通过DataTemplates实例化和销毁。 例如。 你可以将MyView的ItemsControl视为DataTemplate,绑定到ObservableCollection<MyViewModel> 。 MyView控件是由绑定引擎创build/收集的,您无法手动调用它们的Cleanup()。 我有一个解决scheme,但想知道这是一个体面的模式,还是有更好的select。 这个想法是从ViewModel发送一个特定的消息来告诉相关的View来处理: public class MyViewModel : ViewModelBase { … public override void Cleanup() { // unregisters its own messages, so that we risk no leak Messenger.Default.Unregister<…>(this); // sends a message telling that this ViewModel is being cleaned Messenger.Default.Send(new ViewModelDisposingMessage(this)); base.Cleanup(); } } public […]
我在我的WPF应用程序中使用MVVM Light工具包。 我想知道从现有窗口打开新窗口的最佳方法是什么。 我有这个MainViewModel ,它负责我的应用程序的MainWindow 。 现在在MainView ,点击一个button,我想打开第二个窗口。 我有RelayCommmand绑定到Button的Command 。 在RelayCommand的方法中,我可以创build一个新的窗口对象,并简单地调用Show() ,如下所示: var view2 = new view2() view2.Show() 但我不认为ViewModel应该负责创build新的view2对象。 我已经阅读这篇文章WPF MVVM从视图模型中获取父母,其中Bugnionbuild议从viewmodel1传递消息到view1 ,然后view1应该创build新的view2 。 但是我不确定把这个消息传递给view1是什么意思呢? view1如何处理消息? 在代码背后还是什么? 问候,Nabeel
有谁知道使用MVVM Light Toolkit创build的开源WPF应用程序吗? 或者任何样品?
我无法理解BorderThickness="{TemplateBinding BorderThickness} 。这里代码: <ControlTemplate TargetType="{x:Type wpftoolkit:DataGridCell}"> <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> </Border> </ControlTemplate> 另外请解释其他types的绑定。
我想处理窗口的“closures”事件(当用户点击右上angular的“X”button),以便最终显示确认消息或/并取消closures。 我知道如何在代码隐藏中做到这一点:订阅窗口的“closures”事件,然后使用“CancelEventArgs.Cancel”属性。 但是我正在使用MVVM,所以我不确定这是不错的方法。 我认为最好的办法是将Closing事件绑定到我的ViewModel中的Command中。 我试过了: <i:Interaction.Triggers> <i:EventTrigger EventName="Closing"> <cmd:EventToCommand Command="{Binding CloseCommand}" /> </i:EventTrigger> </i:Interaction.Triggers> 在ViewModel中有一个关联的RelayCommand,但它不起作用(该命令的代码没有执行)。
我正在尝试创build一个处理popup窗体的策略,以供我的应用程序的任何部分使用。 我的理解到目前为止,我将需要在我的主窗口的根单个UserControl 。 这将被绑定到它自己的ViewModel,它将处理在应用程序内发送的消息。 我正在使用MVVM Light,对于Messenger类我还是比较新的。 想象一下Master / Details场景,一个对象包含在ListBox 。 select这些项目中的一个,然后单击“编辑”button将显示一个覆盖整个屏幕的UserControl 。 用户可以编辑所选项目,然后单击确定提交更改。 我想打开的UserControl是“通用”的方式,我可以抛出任何(可能是一个ViewModel)…它通过DataTemplate呈现ViewModel并处理所有对象的变化。 点击确定将callback到发送类,并像以前一样坚持更改。 有些情况下,这将是有用的是… 显示不需要用户input的错误消息(除了确定closures它) 显示数据项目的编辑表单 确认对话框(很像标准的MessageBox) 任何人都可以提供任何代码样本,我怎么可能实现这个?
我已经将CollectionChanged eventhandler(onCollectionChanged)添加到其中一个ObservableCollection属性。 我发现onCollectionChanged方法仅在添加项目或将项目移除到集合的情况下才会被调用,但是在收集项目被编辑的情况下不会被调用。 我想知道如何发送一个集合中新增,删除和编辑项目的列表/集合。 谢谢。
我使用mvvm light来构buildSilverlight应用程序。 是否有代码片段,展示了如何从另一个视图模型或用户控件的代码中访问视图模型的属性或命令? 我想这很简单,但是我有点遗漏了一些东西。 Ueli