2013-04-15 37 views
0

这个问题很简单,但我无法准确掌握如何去做。反正有没有通过wpf中的viewmodel来调用命令?

我决定使用WPF,但我不想以经典的方式实现一些MVVM模式。

在我的项目,我决定创建我的模型与INPC,并把它们作为饲料到我的XAML,好像他们是视图模型以及..所以不是有:
视图(< -Binding-> )视图模型(< -INPC - >)型号

我设计的是:
视图(< - 结合 - >)模型。

课程的约束是模型必须实现INPC,但是相比于在实践中的经典MVVM - 模型也需要实现INPC - 所以我觉得我这是由DRY原则导向的高效快捷完全没有问题。

我也想支持命令,我喜欢命令的概念,并且我理解如何在使用视图模型时实现命令。但正如我所描述的,我决定跳过视图模型。

所以提供我已经命令写成如下:

public class MyCommand : ICommand 
{ 
    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
    //do somthing 
    } 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 
} 

,我的XAML看起来财产以后这样的:

<UserControl x:Class=... blah blah... 
xmlns:Model="clr-namespace:MyProject.BusinessLogic.Person" 
xmlns:Commands="clr-namespace:MyProject.Commands"> 

<TextBox Text="{Binding FirstName}" /> 
<Button Command="What do I put here?" /> 

<UserControl> 

那么,什么我把按钮命令,它允许调用MyCommand (不在模型中)?

+1

丰满的命令?这些日子里的术语会变得怪异吗? – siride

+0

大声笑,对不起,我会解决它 - 我的意思是铅垂:) –

+0

这似乎很奇怪,当然任何指挥都与表现逻辑有关,而视图模型恰恰是放置这个逻辑的地方 – devdigital

回答

1

你确实需要一个视图模型,这就是你的表现逻辑应该去的地方,包括指挥。

由于您的模型位于System.Windows.Input名称空间中,因此显然不能提及ICommand等,因此您需要一种桥接模型与视图(即视图模型)的类型。

如果您不希望完全遵循该模式并希望避免将所有视图模型调用委托给该模型,则可以将该模型作为视图模型的属性公开。

另一个考虑是,如果你在做MVVM,那么你really should be using an MVVM framework。他们将提供一种替代指挥的方式,这有其局限性。

例如,如果您希望重新想象您的用户界面,以便在未启用时隐藏Button,则无法通过指令轻松实现。

诸如Caliburn.Micro之类的MVVM框架提供Actions,它提供了许多优于命令的好处。

+0

实际上,如果你想隐藏一个禁用的按钮,你可以通过一个触发器轻松实现,具体取决于IsEnabled = false。在这种情况下,按钮被禁用的方式并不重要。 – hbarck

+1

如果您想保持按钮处于启用状态,但在点击该对话框时弹出一个对话框表示该操作不可行,该怎么办? – devdigital

+0

@ devdigital请包括你给我的评论的答案,所以我可以将这个答案归功于真正解决了我的问题的答案。 (将模型包含在属性中并将其展示在虚拟机中 - 这消除了重新声明所有属性并规范体系结构的需要) –

1

您可能需要阅读此:http://wpfglue.wordpress.com/2012/05/07/commanding-binding-controls-to-methods/

的想法是有可重用的组件,允许创建该模型调用的方法的CommandBinding,并且可以在XAML进行配置。所以,“管道”将由这些组件完成,而模型只会实现与业务相关的方法。

这可以概括为我称之为ViewModelKit的东西,即一组组件,它们可以作为XAML中的资源组装起来,并覆盖ViewModel的常见作业。

相关问题