1

我使用RelayCommand了 MVVM Foundation,现在,当我尝试使用“正常”ICommand时,我真的不知道如何使用它,特别是“绑定”到我的主类使用的变量。我只是想在主类视图模型中创建一个OkCommand引发事件( )。RequestClose另外,我只想在所有绑定都有效的情况下启用它。验证是使用实现的ValidationRule,如下所示

<TextBox>
    <TextBox.Text>
        <Binding Path="Blue">
            <Binding.ValidationRules>
                <validators:ByteValidator />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>
4

1 回答 1

1

ICommand是一个接口,所以它本质上是抽象的。你不能直接使用它——你需要实现它的东西。(例如RelayCommand

ICommandWPF 确实提供了:的内置实现RoutedCommand。(以及相关的派生类型,RoutedUICommand.)但是,这些类型是为与您描述的不匹配的非常特定的场景而设计的。(他们使用 UI 树的结构来确定将处理命令的内容。这通常仅适用于您对控件直接提供的某些常用命令有多个不同实现的情况。例如,TextBox 知道如何实现剪切、复制、粘贴等,并且您希望拥有焦点的 TextBox 来处理命令。)

所以没有真正的“正常”ICommand实现。而且,您可能不想使用验证规则......

验证规则非常有限,很难让它们支持您描述的场景。它们有两个限制:

  1. 它们实际上只适用于完全独立的验证规则,无需任何上下文即可应用。(例如“这个字符串是十进制数吗?”)
  2. 很难将它们与其他任何东西联系起来,因为整个机制没有上下文的概念。

第二个让你很难做你想做的事。这就是为什么它们没有被大量使用的原因,这可能是微软引入更好机制的原因——对于大多数验证场景,您不使用 ValidationRule,而是让您的数据源实现 IDataErrorInfo。

原则是您的数据源对象决定它是否有效。然后您的数据源对象还可以修改任何命令的有效性。这就是在项目无效时禁用 OkCommand 对象的方式。

而且由于 WPF 没有提供适合这种情况的简单内置 ICommand 实现,这就是为什么人们觉得需要编写类似RelayCommand. 这是对 WPF 实际上没有内置的“正常”命令这一事实的回应——它只有时髦的路由命令。

于 2010-11-07T22:35:45.267 回答