Edw*_*uay 8 wpf routed-commands conceptual mvvm
以下RoutedCommand示例有效.
但是,执行命令的按钮的处理是在视图的代码隐藏中.我理解MVVM的方式应该是在ViewModel中.
但是,当我将方法移动到ViewModel(并将其更改为公共)时,我得到错误" 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}"/>
Run Code Online (Sandbox Code Playgroud)
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));
}
Run Code Online (Sandbox Code Playgroud)
Commands.cs:
using System.Windows.Input;
using TestDynamicForm123.View;
namespace TestDynamicForm123
{
public class Commands
{
public static RoutedCommand SaveCustomer =
new RoutedCommand("SaveCustomer", typeof(ManageCustomersView));
}
}
Run Code Online (Sandbox Code Playgroud)
您将从ViewModel中公开引用该命令的属性.
class MyViewModel
{
public RoutedCommand SaveCmd{ get{ return Commands.SaveCustomer; } }
}
Run Code Online (Sandbox Code Playgroud)
然后在XAML中
<Button Command="{Binding SaveCmd}" />
Run Code Online (Sandbox Code Playgroud)
但是,您可能会发现使用RelayCommand更容易,因此您也可以在模型中定义实际的命令逻辑.
归档时间: |
|
查看次数: |
3690 次 |
最近记录: |