C # - Как переключать кнопки с помощью команд - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь понять шаблон MVVM, и поэтому я начал изучать концепции привязки и команд в C #.Чтобы понять этот шаблон, я создал простой графический интерфейс для прокси-сервера.В графическом интерфейсе есть две кнопки, одна для запуска и одна для остановки сервера.

Если пользователь запускает прокси-сервер, нажимая кнопку запуска, я хотел бы отключить кнопку запуска и включить кнопку остановки.Таким образом, я могу быть уверен, что метод stop proxy может быть вызван только во время работы прокси.Когда пользователь нажимает кнопку остановки прокси, я бы хотел снова включить кнопку запуска прокси.

Я приказываю понять, что создал класс 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;
    }
}

Код для прокси-команд start и stop следующий:

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);
    }
}

Теперь мне интересно, как мне этого добиться.Я подумал, что могу передать переменную IsProxyRunning в StartProxyMethod и StopProxyMethod (в viewmodel) и делегировать значение переменной кнопкам в графическом интерфейсе.Однако это не сработало, как ожидалось.

Мне кажется, что я не смотрю в правильном направлении, чтобы заархивировать свою цель, если у вас есть идея, где я ошибаюсь, я бы хотел знать.

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

вы можете использовать RelayCommand для свойств команды в ViewModel.В методе CanExecute-Method возвращается! IsProxyRunning или без него!для остановки.

0 голосов
/ 03 марта 2019

Вы правы, что делаете это неправильно.

Вам нужно использовать этот конструктор для Command (в первой части (Action) определить метод, который вы выполняете, а вFunc определяет, когда кнопка может быть выполнена):

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

Затем вам нужно удалить StartProxy.cs и StopProxy.cs.

Наконец, когда кнопка нажата, вам нужноЗвоните:

StartProxy.ChangeCanExecute();
StopProxy.ChangeCanExecute();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...