Как лучше всего обрабатывать клик-события в MVVM? - PullRequest
1 голос
/ 12 апреля 2011

Как лучше всего обрабатывать клик-события в MVVM? Есть ли лучший способ?

Я нашел два решения:

с командой relay:

RelayCommand buttonAddCategory_Click;
public ICommand ButtonAddCategory_Click
{
    get
    {
        return buttonAddCategory_Click ?? (buttonAddCategory_Click = new RelayCommand(param => this.AddCategory(),
                                                                                      param => true));
    }
}

pro:?; И наоборот: нужен обходной путь с событиями, если бы я изменил элементы пользовательского интерфейса , такие как фокус

с прикрепленным поведением:

public static bool GetIsResetMouseLeftButtonDown(TreeView treeView)
{
    return (bool)treeView.GetValue(IsResetMouseLeftButtonDownProperty);
}
public static void SetIsResetMouseLeftButtonDown(TreeView treeViewItem, bool value)
{
    treeViewItem.SetValue(IsResetMouseLeftButtonDownProperty, value);
}
public static readonly DependencyProperty IsResetMouseLeftButtonDownProperty =
    DependencyProperty.RegisterAttached("PreviewMouseLeftButtonDown", typeof(bool), typeof(TreeViewBehavior),
    new UIPropertyMetadata(false, OnIsMouseLeftButtonDownChanged));

pro: у вас есть RoutedEventArgs для изменений в пользовательском интерфейсе; против: доступ к другим элементам управления?

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

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Для меня нет простого ответа на этот вопрос. Вот как я это вижу:

  • если у вас есть определенное изменение состояния на виртуальной машине, предоставьте RelayCommand, который затем может быть привязан к чему-то, что вызывает его. В 99,9% случаев это кнопка / пункт меню. То, где это может быть легко использовано. Случаи, которые оставлены -> хорошо, возможно, потребуется обходной путь, например, вызов метода из представления. Поэтому следует использовать RelayCommand, если вы действительно нацелены на ВМ.

  • Изменение фокуса, с другой стороны, является функциональностью, связанной с просмотром. Имхо это не имеет ничего общего с WM. Это означает, что для меня это должно быть реализовано в представлении. Так что для меня я бы даже выбрал простой обработчик событий, который делает эту работу.

НТН, Martin

0 голосов
/ 15 сентября 2011

Мне нравится эта идея:

Логика пользовательского интерфейса, такая как открытие новых окон, отображение / скрытие элементов и т. Д. Вы сохраняете это в коде позади.

Когда этот 'щелчок' должен что-то сделать с моделью, вызовите действие.

Итак, кнопка, которая закрывает окно и сохраняет что-то, будет определена так:

<Button  Name="SaveBtnr" VerticalAlignment="Bottom" 
        Command="{Binding Save}" Click="OnSaveClick"
        CommandParameter="{Binding}">Save</Button>

И обработчик будет:

private void OnSaveClick(object sender, RoutedEventArgs e)
    {
        //Do UI Stuff
    }

А потом твоя команда:

  public void SaveCommand(object parameter)
    {
        //SaveStuff            
    }
...