响应视图模型中的路由命令

时间:2013-11-12 14:12:24

标签: wpf xaml mvvm

我想在我的viewmodel中通过按钮处理路由命令。我可以在Usercontrol的代码隐藏中使用它,如下所示:

Dim NewCommandBinding As CommandBinding = New CommandBinding(GlobalCommands.ResultsFilterChangedCommand,
                                                                     AddressOf ExecuteResultsFilterChanged,
                                                                     AddressOf CanExecuteResultsFilterChanged)
        CommandBindings.Add(NewCommandBinding)

然后在XAML中绑定它:

<ToggleButton x:Name="FilterTgl" Content="Archives" Margin="10,4" Padding="10,2"
                            Command="cmds:GlobalCommands.ResultsFilterChangedCommand" />

但是当我将代码移动到viewmodel时,我得到'Commandbindings is not declared'。大概是因为我的UserControl是UI而我的ViewModel不是。

我是否应该尝试直接在viewmodel中处理命令?谢谢你的任何建议。

3 个答案:

答案 0 :(得分:2)

是的,您的viewmodel应该通过声明xaml绑定的命令属性来处理按下按钮 - 请参阅此链接以获取一个简单示例:MWWV Command Example

答案 1 :(得分:2)

对于MVVM,我强烈建议您调查RelayCommand。这对于MVVM来说绝对是完美的,因为它使您能够使用简单的Lambda表达式编写命令。以下是使用我的自定义ActionCommand的简单示例,该示例与RelayCommand

非常相似
public override ICommand DeleteCommand
{
    get { return new ActionCommand(action => Delete(action), canExecute => CanDelete()); }
}

您可以在MSDN上的WPF Apps With The Model-View-ViewModel Design Pattern文章中找到RelayCommand的详细说明,并在MSDN开发人员论坛的Implementation RelayCommand帖子中更清楚地实现它。

答案 2 :(得分:2)

您应该对您的命令进行数据绑定,而不是显式设置属性。假设您的ViewModel是您的视图的数据上下文,语法看起来像这样(我没有尝试运行它):

<ToggleButton Command="{Binding NameOfTheCommandPropertyOnYourViewModel}"/>

您的viewmodel应该将您的命令公开为ICommand,它应该是一个属性(而不仅仅是一个字段)。

我也同意谢里丹 - 你应该考虑转发命令。