C# 命令绑定不工作

C# 命令绑定不工作,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在使用MVVM为大学开发我的第一个WPF应用程序。我无法让这个特定的绑定工作,尽管我已经遵循了前面使用的成功步骤 我有以下xaml片段: <Button Command="{Binding GetTicketsCommand}" Canvas.Left="50" Canvas.Top="202" Content="Refresh List" Height="25" Width="137" /> viewmodel有一个名为GetTicketsCommand的命令,

我正在使用MVVM为大学开发我的第一个WPF应用程序。我无法让这个特定的绑定工作,尽管我已经遵循了前面使用的成功步骤

我有以下xaml片段:

    <Button Command="{Binding GetTicketsCommand}" Canvas.Left="50" Canvas.Top="202"    Content="Refresh List" Height="25" Width="137" />
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();
    }

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

框架中提供了DelegateCommand,有关基于DelegateCommand的RelayCommand实现的更多详细信息,请参阅

但指挥也有局限性。例如,如果命令声明某个按钮无法执行,则该按钮将被禁用。如果你想隐藏按钮呢?命令限制了重新生成UI的范围

您可能需要查看哪些实现。这些允许您从控件类型的默认事件中调用视图模型上的谓词,所有这些都基于约定


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

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

框架中提供了DelegateCommand,有关基于DelegateCommand的RelayCommand实现的更多详细信息,请参阅

但指挥也有局限性。例如,如果命令声明某个按钮无法执行,则该按钮将被禁用。如果你想隐藏按钮呢?命令限制了重新生成UI的范围

您可能需要查看哪些实现。这些允许您从控件类型的默认事件中调用视图模型上的谓词,所有这些都基于约定


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

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

public ICommand GetTicketsCommand { get; set; }
而不是一个领域:

public ICommand GetTicketsCommand;

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

public ICommand GetTicketsCommand { get; set; }
而不是一个领域:

public ICommand GetTicketsCommand;

我们可以在视图模型中看到管理命令的代码吗?您使用的是哪个MVVM工具包?在运行时VS中的输出窗口中是否存在绑定错误?viewmodel看起来怎么样?当您使用一个参数调用构造函数时,您显示的实例化命令的构造函数不接受任何参数。可能是因为您调用了错误的构造函数吗?@nemesv yes我收到此错误BindingExpression路径错误:“GetTicketCommand”属性未在“object”JobListViewModel“HashCode=49676947”上找到。BindingExpression:Path=GetTicketCommand;DataItem='JobListViewModel'HashCode=49676947;目标元素是“按钮”名称=;虽然我正在设置datacontext,但目标属性是'Command'类型'ICommand'。我们可以在视图模型中看到管理命令的代码吗?您使用的是哪个MVVM工具包?在运行时VS中的输出窗口中是否存在任何绑定错误?viewmodel看起来怎么样?当您使用一个参数调用构造函数时,您显示的实例化命令的构造函数不接受任何参数。可能是因为您调用了错误的构造函数吗?@nemesv yes我收到此错误BindingExpression路径错误:“GetTicketCommand”属性未在“object”JobListViewModel“HashCode=49676947”上找到。BindingExpression:Path=GetTicketCommand;DataItem='JobListViewModel'HashCode=49676947;目标元素是“按钮”名称=;虽然我正在设置datacontext,但目标属性是'Command'类型'ICommand'。谢谢。这是多么愚蠢的错误:一个你根本看不见你脸上的表情的错误。再次感谢,谢谢。这是多么愚蠢的错误:一个你根本看不见你脸上的表情的错误。再次感谢。谢谢你的信息和进一步的阅读。我一定会看的。谢谢你的信息和进一步的阅读。我一定会看看这些。