Как обрабатывать выполнение и может выполнять условия в динамической кнопке в MVVM - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть кнопка как аксессуар в моем TabControl, где находится 5 TabItem.Эта кнопка копирует другой объект, используемый на вкладках.Каждый TabItem имеет CustomView (где находятся все его компоненты, TextView, TextBox и т. Д.). Я хочу иметь возможность реализовать различные функции для этой кнопки для каждой вкладки в одной команде, поэтому я реализовал общую команду копирования, которая проверяетИндекс текущей вкладки, чтобы увидеть, что мы в данный момент на какой вкладке, но как лучше всего обработать мои Невозможно выполнить условия , не повторяя мой случай переключения в методе Условия?Например, первая кнопка вкладки не может быть выполнена (отключена), если ее объект равен нулю, вторая кнопка вкладки не может быть выполнена, когда ее объект равен нулю.

  • Первая вкладка «Пользователи» имеет CustomerView

  • Вторая вкладка «Деятельность» имеет ActivityView

Код:

public RelayCommandWithCannotExecuteReason Copy
        {
            get
            {
                if (_copy == null)
                {
                    _copy = new RelayCommandWithCannotExecuteReason(
                        x =>
                        {

                            switch (SelectedTabIndex) {
                                case 1:
                                    Clipboard.SetData("First", object1);
                                    break;
                                case 2:

                                    Clipboard.SetData("Second", object2;
                                    break;
                            }

                        }, CanCopyConditions);
                }

                return _copy;
            }
        }

1 Ответ

0 голосов
/ 04 декабря 2018

Почему бы не создать подкласс типа RelayCommandWithCannotExecuteReason и создать выделенный объект команды?Вся логика содержится в команде, все, что вы будете делать, это создавать несколько команд во всех ваших моделях представлений.

Нет ничего плохого в создании выделенного класса команд для обработки логики, специфичной для ВМ, вот чтопрограммисты делают.Создание конкретной реализации абстракции, такой как ICommand или RelayCommandWithCannotExecuteReason, является ТВЕРДЫМ.

public class CopyCommand : RelayCommandWithCannotExecuteReason
{
    ViewModel _vm;
    public CopyCommand( ViewModel vm)
    { 
       _vm = vm;
    }

    public void Execute(object parameter) 
    {
       switch (_vm.SelectedTabIndex) 
       {
         case 1:
            _vm.Clipboard.SetData("First", object1);
            break;
         case 2:
           _vm.Clipboard.SetData("Second", object2;
            break;
        }
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

}

Теперь вы используете эту команду в своей виртуальной машине.Есть много простых способов, вот пример, похожий на тот, который у вас есть сейчас ...

 public CopyCommand Copy
 {
     get
     {
          if (_copy == null)
          {
             _copy = new CopyCommand(this);
          }
       return _copy;
      }

Или создайте экземпляр в конструкторе или инициализаторе вашей основной виртуальной машины:

public ViewModel() //constructor
{
  _copy = new CopyCommand(this);

}

public CopyCommand Copy
{
     get
     {
         return _copy;
     }
}

Если у вас есть экземпляр модели представления для каждой вкладки и вы хотите делегировать логику CanExecute () для «SelectedTab», тогда вам понадобится что-то вроде этого:

Давайте предположим, что все ваши модели представления наследуютбазовый класс, подобный этому:

public abstract class BaseTabViewModel
{
   public abstract bool CanCopy();
}

Тогда вы бы подкласса этого базового класса в ваших моделях представления вкладок.Вы бы реализовали абстракцию:

 public class Tab1ViewModel : BaseTabViewModel
 {
    …

 public override bool CanCopy(){
     //custom logic....
     return true; 
 }

Теперь нам нужно изменить порядок CopyCommand для ссылки на абстракцию, я изначально закодировал эту команду для использования ViewModel, теперь мы вместо этого определим тип как абстракцию.Поэтому измените класс ViewModel:

public class CopyCommand : RelayCommandWithCannotExecuteReason
{
    BaseTabViewModel _vm;
    public CopyCommand( BaseTabViewModel vm)
    { 
      _vm = vm;
    }

Теперь метод CanExecute () может вызывать соответствующую логику:

 public bool CanExecute(object parameter)
 {
      return _vm.CanCopy();
 }

Это работает, только если:

  • Все модели представлений вкладок являются экземплярами типа BaseTabViewModel.

Этот механизм намного более понятен и более гибок.Удачи.

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