命令绑定无法工作。

3

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

视图模型具有名为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();
    }

你能让我们看看你的视图模型中管理命令的代码吗? - BoltClock
你正在使用哪个 MVVM 工具包? - Felice Pollano
1
在运行时,VS 的输出窗口中是否有任何绑定错误?你的视图模型是什么样子的? - nemesv
你展示的构造函数实例化你的命令时没有接受任何参数,而你却调用了一个带有一个参数的构造函数。这可能是因为你调用了错误的构造函数吗? - BoltClock
@nemesv 是的,我遇到了这个错误BindingExpression路径错误:'GetTicketCommand'属性在'object''JobListViewModel'(HashCode=49676947)上未找到。 BindingExpression:Path=GetTicketCommand; DataItem='JobListViewModel' (HashCode=49676947); target element is 'Button' (Name=''); target property is 'Command' (type 'ICommand'),尽管我已经设置了数据上下文? - Darren Young
@BoltClock 不好意思,那只是一个打字错误。 - Darren Young
2个回答

11

绑定只适用于属性。请确保您的视图模型中的GetTicketsCommand命令是一个属性:

public ICommand GetTicketsCommand { get; set; }

而不是一个字段:

public ICommand GetTicketsCommand;

谢谢。多么愚蠢的错误 :) 这种错误就是你看不到一直盯着你的那种。再次感谢。 - Darren Young

1

对于MVVM场景,与WPF提供的RoutedCommand相比,RelayCommand或DelegateCommand更适合。

DelegateCommand在Prism框架中提供,并且请参阅http://msdn.microsoft.com/en-us/magazine/dd419663.aspx以获取关于RelayCommand(基于DelegateCommand)实现的更多详细信息。

然而,命令有其限制。例如,如果命令状态为无法执行,则按钮将被禁用。如果您想要隐藏按钮呢?命令限制了您重新设计UI的范围。

您可能需要查看Caliburn.Micro,它实现了Actions。这些让您从控件类型的默认事件中调用视图模型上的动词,所有这些都基于约定。

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

感谢提供这些信息和进一步阅读材料。我一定会仔细查看的。 - Darren Young

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接