Пользовательские команды в wpf - PullRequest
4 голосов
/ 19 марта 2011

Я работаю над приложением WPF, которое имеет панель инструментов / меню, которое будет использовать несколько пользовательских команд. Вероятно, около 15-20. Я видел документацию о том, как создавать собственные команды, но ни одна из них не обязательно относится к тому, что я пытаюсь сделать.

Я использую контроллер для обработки бизнес-логики в своем приложении и пытаюсь не допустить, чтобы мой взгляд вообще делал какую-либо логику.

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

Я также видел использование класса DelegateCommand, но не совсем уверен, хочу ли я идти в этом направлении.

Я бы хотел иметь произвольный класс пользовательских команд, такой как следующий

public CustomCommand: ICommandd
{
    public bool CanExecute(object parameter)
    {
        //arbitrary logic
    }

    public void Execute(object parameter)
    {

    }
}

Идея состоит в том, что у меня их будет 10-20, и я хочу отделить их от всего остального, и при необходимости их вызывать.

Я знаю, что есть способ разделить свои пользовательские команды, но я не совсем уверен.

Я новичок в использовании команд, поэтому все еще пытаюсь овладеть этой концепцией.

спасибо,

Ответы [ 3 ]

4 голосов
/ 19 марта 2011

Идея заключается в том, что вы привязываете команду к кнопке, и команда управляет двумя свойствами этой кнопки: «при нажатии» и «включенным», в результате чего вы публикуете интерфейс.

Основная причина, по которой вы хотите командовать, - это возможность привязывать нажатия кнопок к действиям в вашей модели представления.

Если вы создаете одну пользовательскую команду, которая выполняет действие в качестве параметра конструктора, вы можете связать методы из вашей модели представления непосредственно с вашей командой.

public class RelayCommand: ICommandd
{
    Action action;
    Func<bool> canExecute;

    public RelayCommand(Action action) : this(action, () => true) {}
    public RelayCommand(Action action, Func<bool> canExecute) 
    { 
        this.action = action; 
        this.canExecute = canExecute;
    }

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

    public void Execute(object parameter)
    {
        action();
    }
}

Использование в вашем представлении модели будет

public RelayCommand SaveCommand { get; set; }

SaveCommand = new RelayCommand(OnSave);

public void Save()
{
    // save logic...
}

Если вы хотите подключить CanExecute, вы также можете использовать второй ctor и предоставить метод CanSave.

public RelayCommand SaveCommand { get; set; }

SaveCommand = new RelayCommand(OnSave, CanSave);

public void Save()
{
    // save logic...
}

public bool CanSave()
{
    return // ... 
}

Как вы могли заметить, я пропустил параметр команды в моей реализации. В большинстве случаев этого будет достаточно, и вы сохраните дополнительные параметры в ваших методах-обработчиках. Для оставшихся 10% я реализовал RelayCommand<T>, который принимает действие вместо действия и меняет метод Execute на

    public void Execute(object parameter)
    {
        action((T)parameter);
    }

, для которого требуется параметризованный обработчик

SaveCommand = new RelayCommand<SomeType>(OnSave);

public void Save(SomeType toSave)
{
    // save logic using parameter
}

Это избавит вас от всех проблем при кастинге, с которыми вы столкнетесь при использовании переменных object, и сохранит тип ваших моделей представления в безопасности.

1 голос
/ 19 марта 2011

Используйте RelayCommand , вам не нужно создавать класс для каждой команды, вы просто добавляете оба метода в конструктор как лямбда-выражения / делегаты.

Я использую все это в своих проектах, это экономит время.

0 голосов
/ 20 марта 2011

Я закончил тем, что отвечал на свой вопрос через следующий пост, http://www.codeproject.com/KB/WPF/CentralizingWPFCommands.aspx?display=Print

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