8

以下 RoutedCommand 示例有效。

但是,执行命令的按钮的处理是在 view 的代码隐藏中。我理解 MVVM 的方式,它应该在 ViewModel 中

但是,当我将该方法移动到 ViewModel(并将其更改为 public)时,我收到错误“ ManagedCustomersView 不包含 OnSave 的定义”。即使我将 RoutedCommand 第二个参数更改为 typeof(ManageCustomersViewModel),我也会收到相同的错误。

如何将命令处理程序从 View-codebehind 移动到 ViewModel?

ManageCustomersView.xaml:

<UserControl.CommandBindings>
   <CommandBinding Command="local:Commands.SaveCustomer" Executed="OnSave"/>
</UserControl.CommandBindings>
...
<Button Style="{StaticResource formButton}" 
   Content="Save" 
   Command="local:Commands.SaveCustomer"
   CommandParameter="{Binding Id}"/>

ManageCustomersView.xaml.cs:

private void OnSave(object sender
                    , System.Windows.Input.ExecutedRoutedEventArgs e)
{
    int customerId = ((int)e.Parameter);
    MessageBox.Show(String.Format
        ("You clicked the save button for customer with id {0}.", customerId));
}

命令.cs:

using System.Windows.Input;
using TestDynamicForm123.View;

namespace TestDynamicForm123
{
    public class Commands
    {
        public static RoutedCommand SaveCustomer = 
             new RoutedCommand("SaveCustomer", typeof(ManageCustomersView));
    }
}
4

1 回答 1

8

您将在 ViewModel 中公开一个引用该命令的属性。

class MyViewModel
{
    public RoutedCommand SaveCmd{ get{ return Commands.SaveCustomer; } }
}  

然后在 XAML

<Button Command="{Binding SaveCmd}" />

但是,您可能会发现使用RelayCommand更容易,因此您也可以在模型中定义实际的命令逻辑。

于 2009-04-30T07:56:43.080 回答