Silverlight中的MVVM (ICommand)

6

请不要苛刻地评判,如果之前已经在大量的prism和mvvm博客中讨论过这个问题或者间接回答过这个问题。在WPF实现的RelayCommand或DelegateCommand类中,有一个这样的事件处理程序:

/// <summary>
/// Occurs whenever the state of the application changes such that the result
/// of a call to <see cref="CanExecute"/> may return a different value.
/// </summary>
public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}

但在SL的命名空间子集中,没有CommandManager类。这就是我卡住的地方。我还没有找到MVVM在SL中的解决方法(PRISM对我来说太复杂了)。不同的简单HelloWorldMVVM应用程序根本不涉及此问题。
提前感谢您,抱歉我的英语 -)
2个回答

5

Silverlight 4.0支持ICommand接口,因此将提供类似于WPF的命令基础结构。


5
在Silverlight中不支持命令。当用户操作视图中的控件时,您需要编写代码(例如事件处理程序)在您的视图的代码后台中修改视图模型。这可能是简单的调用视图模型上的方法,例如当用户单击视图中的按钮时。通过使用PRISM,您可以创建附加属性来消除这些事件处理程序,但如果您不想使用PRISM,您可以继续使用事件处理程序。
另一个方面是在视图模型更改时修改视图。特别是您将希望根据视图模型的状态启用和禁用控件。为了实现这一点,您将不得不将控件的“IsEnabled”属性绑定到反映某个操作是否允许的视图模型中的内容。实现自定义的“IValueConverter”对象以将其转换为布尔值通常非常有用。例如,如果您的视图模型具有表示计数的属性,并且您希望视图中的特定控件仅在计数大于零时启用,则可以创建一个将数字转换为“true”的值转换器,并在绑定中使用此值转换器。
如果您尝试适应WPF MVVM应用程序的示例,则必须摆脱所有使用命令的内容并替换为自己的代码。您示例中的代码在Silverligt中没有意义,但在WPF中,它涉及确定视图中的控件是否启用,可见等。

我认为你有点错了 - Silverlight 2中支持ICommand(可能有限,但它确实存在,类ICommand也存在)。 - Andrey Khataev
1
虽然在Silverlight中定义了ICommand接口,但它并没有被使用,而且在WPF中与MVVM模式非常配合的整个命令基础设施在Silverlight中是缺失的。 - Martin Liversage
谢谢。我以为ICommand的存在意味着完全的命令支持,所以我错了。所以,结果是SL中的MVVM实现并不像WPF那样容易。目前我只找到一种方法 - 使用附加属性和行为,就像这样: http://blogs.southworks.net/jdominguez/2008/08/icommand-for-silverlight-with-attached-behaviors/ 或者使用准备好的框架,其中许多事件被包含在内 http://nroute.codeplex.com - Andrey Khataev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接