C#-如何使用命令切换按钮

时间:2019-03-02 20:28:21

标签: c# xaml mvvm

我试图理解MVVM模式,因此我开始学习C#中的绑定和命令的概念。为了理解这种模式,我为代理服务器创建了一个简单的GUI。 GUI有两个按钮,一个用于启动服务器,一个用于停止服务器。

如果用户通过单击开始按钮来启动代理,我想禁用开始按钮并启用停止按钮。这样,我可以确定只有在代理运行时才能调用stop代理方法。当用户单击停止代理按钮时,我想再次启用启动代理按钮。

为了实现这一点,我创建了一个如下所示的viewmodel类:

class ViewModelBase {
    public ICommand StartProxy { get; set; }
    public ICommand StopProxy { get; set; }
    public bool IsProxyRunning = false;

    public ViewModelBase() {
        StartProxy = new StartProxy(StartProxyMethod);
        StopProxy = new StopProxy(StopProxyMethod);
    }

    private void StartProxyMethod(object Parameter) {
        MessageBox.Show("Implement the start proxy method here");
        IsProxyRunning = true;
    }

    private void StopProxyMethod(object Parameter) {
        MessageBox.Show("Implement the stop proxy method here");
        IsProxyRunning = false;
    }
}

启动和停止代理命令的代码如下:

StartProxy

public class StartProxy : ICommand {
    Action<object> StartProxyMethod;
    public event EventHandler CanExecuteChanged;

    public StartProxy(Action<object> StartProxyMethod) {
        this.StartProxyMethod = StartProxyMethod;
    }

    public bool CanExecute(object Parameter) {
        //How to check if the proxy is not running (if so, this method can be executed)
        return true;
    }

    public void Execute(object Parameter) {
        StartProxyMethod(Parameter);
    }
}

StopProxy

public class StopProxy : ICommand {
    Action<object> StopProxyMethod;
    public event EventHandler CanExecuteChanged;

    public StopProxy(Action<object> StopProxyMethod) {
        this.StopProxyMethod = StopProxyMethod;
    }

    public bool CanExecute(object Parameter) {
        //How to check if the proxy is running (if so, this method can be executed)
        return true;
    }

    public void Execute(object Parameter) {
        StopProxyMethod(Parameter);
    }
}

现在我想知道如何实现这一目标。我以为我可以在StartProxyMethod和StopProxyMethod中(在视图模型中)传递IsProxyRunning变量,并将变量的值委托给GUI中的按钮。但是,这没有按预期进行。

如果您对我错了,我想知道。我觉得我没有朝正确的方向提出目标。

2 个答案:

答案 0 :(得分:1)

您可以在ViewModel中将RelayCommand用于命令属性。 在CanExecute-Method中,返回!IsProxyRunning或不返回!停下来。

答案 1 :(得分:0)

您做错了是对的。

您需要将此构造函数用于Command(在第一部分(Action中定义您执行的方法,在Func中定义按钮何时可以执行) :

public Command (Action<object> execute, Func<object,bool> canExecute);

然后,您需要删除StartProxy.cs和StopProxy.cs。

最后,当按下按钮时,您需要致电:

StartProxy.ChangeCanExecute();
StopProxy.ChangeCanExecute();