我想在我的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中处理命令?谢谢你的任何建议。
答案 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,它应该是一个属性(而不仅仅是一个字段)。
我也同意谢里丹 - 你应该考虑转发命令。