0

这个问题很简单,但我无法准确掌握如何去做。

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

在我的项目中,我决定使用 INPC 创建我的模型,并将它们用作我的 XAML 的提要,就好像它们也是 View-Model 一样。所以而不是:
View(<-Binding->)View-Model(<- INPC->)型号

我设计的是:
View(<-Binding->)Model。

当然,约束是模型必须实现 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(不在模型中)?

4

2 回答 2

1

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

您的模型显然不能对ICommandetc. 有任何引用,因为它位于System.Windows.Input命名空间中,因此您需要一种将模型与视图桥接的类型,即视图模型。

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

另一个考虑因素是,如果您正在使用 MVVM,那么您真的应该使用 MVVM 框架。他们将提供一种替代指挥的方式,指挥有局限性。

例如,如果您希望重新设计您的 UI,以便Button在未启用时隐藏 a,那么您无法通过命令轻松实现此目的。

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

于 2013-04-15T18:05:36.367 回答
1

您可能想阅读以下内容:http ://wpfglue.wordpress.com/2012/05/07/commanding-binding-controls-to-methods/

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

这可以概括为我称之为 ViewModelKit 的东西,即一组可以在 XAML 中组装为资源并涵盖 ViewModel 的常见工作的组件。

于 2013-04-15T19:50:47.107 回答