Каков «правильный» способ в WPF MVVM связать событие frameworkElement с обработчиком viewmodel? - PullRequest
1 голос
/ 21 августа 2009

Итак, вот моя дилемма, я хочу обработать события представления в моей модели представления, проблема в том, что для добавления обработчика события мое представление должно иметь код файла и, следовательно, должен быть установлен атрибут класса. Я на 99% уверен, что это плохая идея, и, если честно, я даже не уверен, как это сделать (кроме очевидной части x: Class = "") Как правильно сделать это в приложение MVVM?

<ResourceDictionary>
    <DataTemplate DataType="{x:Type vm:OutletViewModel}">
        <Button Click="IHaveNoBinding">
    </DataTemplate>
</ResourceDictionary>

Ответы [ 4 ]

4 голосов
/ 21 августа 2009

Использовать команды :

<Button Command="{Binding ACommandOnYourViewModel}"/>

См. моего поста о полезной реализации команды, которую можно использовать в моделях представления.

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

2 голосов
/ 21 августа 2009

Я использую Attached Behaviors. Прикрепленное поведение в основном переводит события в команды. Проверьте эту ссылку для примера:

http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx

Вот код для TextChangedBehavior.

 public static class TextChangedBehavior
  {
    public static readonly DependencyProperty TextChangedCommandProperty =
        DependencyProperty.RegisterAttached("TextChangedCommand",
                                            typeof(ICommand),
                                            typeof(TextChangedBehavior),
                                            new PropertyMetadata(null, TextChangedCommandChanged));

    public static ICommand GetTextChangedCommand(DependencyObject obj)
    {
      return (ICommand)obj.GetValue(TextChangedCommandProperty);
    }

    public static void SetTextChangedCommand(DependencyObject obj, ICommand value)
    {
      obj.SetValue(TextChangedCommandProperty, value);
    }

    private static void TextChangedCommandChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
      TextBoxBase textBox = obj as TextBoxBase;

      if (textBox != null)
      {
        textBox.TextChanged += new TextChangedEventHandler(HandleTextChanged);
      }
    }

    private static void HandleTextChanged(object sender, TextChangedEventArgs e)
    {
      TextBox textBox = sender as TextBox;
      if (textBox != null)
      {
        ICommand command = GetTextChangedCommand(textBox);
        command.Execute(textBox.Text);
      }
    }
  }

XAML:

<TextBox behavior:TextChangedBehavior.TextChangedCommand="{Binding TextChangedCommand}" />
1 голос
/ 22 августа 2009

Как правило, я не буду использовать прикрепленный шаблон поведения для простых вещей, как это. Как консультант я нахожу, что это усложняет вещи для новых разработчиков.

Так как же тогда вы управляете взаимодействием управления, когда нет доступных команд? Приготовьтесь подняться с пола :-) Я часто буду использовать код для этого. Обработчик события в коде позади обрабатывает событие, собирает все необходимые данные из аргументов события и затем перенаправляет запрос в модель представления. Делая это, вы не теряете много, так как большинство вещей, которые не поддерживают ICommand, не могут использовать скрытие / показ / включение / отключение.

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

0 голосов
/ 29 августа 2009

Код позади совсем не плохая вещь. Существует достаточно сценариев, когда вы не можете использовать привязку данных WPF (например, PasswordBox), а затем вам нужно создать код за файлом.

Как вы можете использовать PasswordBox без привязки, показано в примере ViewModel этого проекта:

WPF Application Framework (WAF)

http://waf.codeplex.com

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