首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用“普通”ICommand

使用“普通”ICommand
EN

Stack Overflow用户
提问于 2010-11-06 21:12:34
回答 1查看 318关注 0票数 1

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

代码语言:javascript
复制
<TextBox>
    <TextBox.Text>
        <Binding Path="Blue">
            <Binding.ValidationRules>
                <validators:ByteValidator />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>
EN

回答 1

Stack Overflow用户

发布于 2010-11-08 06:35:45

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

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

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

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

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

第二个问题会让你很难做你想做的事情。这就是为什么它们没有被广泛使用的原因,这可能也是为什么微软引入了一种更好的机制-对于大多数验证方案,您不使用ValidationRule,而是让您的数据源实现IDataErrorInfo。

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

而且,由于WPF没有提供适合此场景的简单的内置ICommand实现,这就是为什么人们觉得有必要编写像RelayCommand这样的东西。它是对这样一个事实的回应,即WPF实际上并没有内置的“正常”命令-它只有时髦的路由命令。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4113230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档