我正在使用MVVM为大学开发我的第一个WPF应用程序。虽然我已经遵循了以前使用过的成功步骤,但我无法使这种特定的绑定工作。
我有以下xaml片段:
<Button Command="{Binding GetTicketsCommand}" Canvas.Left="50" Canvas.Top="202" Content="Refresh List" Height="25" Width="137" />
视图初始化VM:
public JobListView()
{
InitializeComponent();
viewModel = new JobListViewModel(this);
this.DataContext = viewModel;
}
viewmodel有一个名为GetTicketsCommand的命令,该按钮绑定到该命令,但是当我单击该按钮时,不会调用命令Execute或CanExecute方法。我创建的命令是在VM构造函数中实例化的。
有什么想法吗?
编辑:
命令类是这样的:
public class GetTicketsCommand : ICommand
{
private readonly JobListViewModel viewModel;
public GetTicketsCommand(JobListViewModel viewModel)
{
this.viewModel = viewModel;
}
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
viewModel.GetTickets();
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}
在viewmodel中我只是在构造函数中创建它的一个实例:
public JobListViewModel()
{
GetTicketsCommand = new GetTicketsCommand(this);
dataAccess = new DataLayerClient();
}
答案 0 :(得分:3)
绑定仅适用于属性。确保视图模型中的GetTicketsCommand
命令是属性:
public ICommand GetTicketsCommand { get; set; }
而不是字段:
public ICommand GetTicketsCommand;
答案 1 :(得分:1)
对于MVVM场景,RelayCommand或DelegateCommand比WPF提供的RoutedCommand更合适。
DelegateCommand在Prism框架中提供,请参阅http://msdn.microsoft.com/en-us/magazine/dd419663.aspx以获取有关RelayCommand实现的更多详细信息(基于DelegateCommand)。
但是,命令有局限性。例如,如果命令声明它无法执行,则将禁用按钮。如果你想隐藏按钮怎么办?命令限制了重新构想UI的范围。您可能希望查看实现Caliburn.Micro的Actions。这些允许您从控件类型的默认事件中调用视图模型上的谓词,所有这些都基于约定。
例如,如果视图上有一个名为Save
的按钮,则单击该按钮时将调用视图模型上的Save
方法。不需要明确的管道。如果视图模型上的CanSave
属性返回false,则可以进一步灵活地处理按钮的行为。