命令绑定不起作用

时间:2012-03-11 10:52:16

标签: c# wpf mvvm

我正在使用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();
    }

2 个答案:

答案 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.MicroActions。这些允许您从控件类型的默认事件中调用视图模型上的谓词,所有这些都基于约定。

例如,如果视图上有一个名为Save的按钮,则单击该按钮时将调用视图模型上的Save方法。不需要明确的管道。如果视图模型上的CanSave属性返回false,则可以进一步灵活地处理按钮的行为。