Как предоставить классы Command представлениям XAML через модели представлений - PullRequest
1 голос
/ 23 декабря 2011

У меня есть простая архитектура MVVM, в которой я использую модель представления для привязки команд к представлению xaml.Мои команды довольно общие, и я буду связывать их с парой представлений, поэтому я поместил их в их собственные классы, реализующие интерфейс ICommand.Внутри модели представления у меня есть общедоступные средства доступа, такие как:

    private ICommand _myCommand;
    public ICommand MyCommand
    {
        get
        {
            if (_myCommand == null)
            {
                _myCommand = new MyCommand(_injectedModel);
            }

            return _myCommand ;
        }
    }

Все это работает, и я доволен архитектурой, но ... У меня есть тонны этих функций.Все они примерно делают одно и то же - выставляют команду как открытое свойство, проверяют, существует ли частная команда, и если да, то используют ее, в противном случае создайте новую команду.Это немного "шаблон" на мой вкус.

Я хотел бы хороший способ абстрагировать это.Я мог бы создать метод, который ищет команды на основе идентификатора из какой-то карты команд.Я мог бы просто создать все свои команды в конструкторе моделей представлений (вместо того, чтобы делать это лениво).

Что бы вы посчитали лучшей практикой?Следует ли избегать создания новой команды внутри каждой модели представления и иметь центральный поиск команд?

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Я мог бы просто создать все свои команды в конструкторе моделей представлений (а не делать это лениво).

Я часто так делаю. Стоимость команды в большинстве реализаций довольно дешевая. В зависимости от вашей реализации, это, вероятно, просто небольшой класс с одной ссылкой на делегат (или парой ссылок на делегаты). ИМО вряд ли будет достаточно значительным, чтобы оправдать ленивую конструкцию.

Я часто пишу это как:

// Constructor
public MyViewModel()
{
    this._injectedModel = SetModel();

    this.MyCommand = new MyCommand(_injectedModel); 
}

ICommand MyCommand { get; private set; }
0 голосов
/ 26 декабря 2011

Вы, похоже, ищете Caliburn.Micro . Он отображает методы ViewModel в x: Name в XAML.
Вам больше не понадобится «шаблонный» код для команд.

Пример:

<Button x:Name="Save" />

Позвонит:

public void Save()
{
   //Save logic
}

При нажатии кнопки.
Обратите внимание, что ни в коем случае я не делал никаких команд, все это делается за сценой.

Это очень простой пример, вы можете добавить параметр (ы) к вызову и заставить его использовать событие, отличное от Click.

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