2

我想在我的视图模型中处理来自按钮的路由命令。我可以让它在 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" />

但是当我将代码移动到视图模型时,我得到“未声明命令绑定”。大概是因为我的 UserControl 是 UI 而我的 ViewModel 不是。

我不应该尝试直接在我的视图模型中处理命令吗?感谢您的任何建议。

4

3 回答 3

2

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

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

您的视图模型应该将您的命令公开为 ICommand,并且它应该是一个属性(而不仅仅是一个字段)。

我也同意 Sheridan 的观点——你真的应该考虑使用中继命令。

于 2013-11-12T14:45:02.800 回答
2

是的,您的视图模型应该通过声明您的 xaml 绑定到的命令属性来处理按钮按下 - 请参阅此链接以获取简单示例: MWWV 命令示例

于 2013-11-12T14:35:27.443 回答
2

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

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

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

于 2013-11-12T14:38:36.070 回答