Лучший / лучший способ объявить RelayCommands - PullRequest
2 голосов
/ 03 февраля 2012

Я пытался найти хороший аккуратный и лаконичный способ объявления RelayCommands в моих ViewModels.

Лучшее, что я могу придумать:

public class MyViewModel
{
    public ICommand StopCommand { get; private set; }

    public MyViewModel()
    {
        StopCommand = new RelayCommand(OnStop);
    }

    private OnStop(object sender)
    {
         //hammertime
    }

}

Что бы я действительно хотел сделать, так это удалить двухэтапное объявление / конструкцию, что-то вроде:

public class MyViewModel
{
    public readonly ICommand StopCommand = new RelayCommand(OnStop);

    private OnStop(object sender)
    {
         //hammertime
    }
}

Однако это не скомпилируется с

ошибка CS0236: инициализатор поля не может ссылаться на нестатический поле, метод или свойство 'MyViewModel.OnStop (object)'

Есть ли более аккуратный / "стандартный" способ, которым люди пользуются?

Ответы [ 3 ]

3 голосов
/ 03 февраля 2012

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

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

1 голос
/ 03 февраля 2012

Один из вариантов - отказаться от команды, которая имеет свои ограничения, и использовать другой механизм, такой как Действия, предоставляемые Caliburn.Micro . Тогда вам просто нужен глагол модели вида:

public void Save()
{
}

<Button x:Name="Save">Save</Button>
0 голосов
/ 03 февраля 2012

Я использовал что-то вроде:

 public ICommand StopCommand 
 { 
     get{return new RelayCommand(OnStop);}
 }
...