Выставление команд для пользовательского управления MVVM внутри GridView в WinRT

У меня есть приложение Windows Store, следуя шаблону MVVM. У меня есть Parent View (с соответствующим Parent ViewModel), который содержит элемент управления GridView. Элемент ItemTemplate для этого элемента управления GridView содержит Child View. В этом дочернем представлении содержится несколько кнопок.

Как подключить его так, чтобы, когда пользователь нажимает кнопку на одном из элементов управления ChildView, метод вызывается в Parent ViewModel?

2 ответа

Вот как я решил решить эту проблему.

  1. Добавьте свойство зависимостей ICommand под кодом Child View.

    public static readonly DependencyProperty ChildButtonCommandProperty = DependencyProperty.Register("ChildButtonCommand", typeof(ICommand), typeof(ChildView),new PropertyMetadata(null, OnChildButtonCommandChanged));
    public ICommand ChildButtonCommand
    { get { return (ICommand)GetValue(ChildButtonCommandProperty); } set { SetValue(ChildButtonCommandProperty, value); }
    }
    private static void OnChildButtonCommandChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    { var self = (ChildView)sender; self.ChildButtonCommand.Command = (ICommand)e.NewValue;
    }
  2. В Parent ViewModel добавьте свойство public getter типа ICommand, реализованное с помощью RelayCommand, которое вы можете найти здесь: https://relaycommandrt.codeplex.com/

  3. В Xaml Parent View привяжите ChildButtonCommand в Child View:

    <gridview.itemtemplate>
    <datatemplate> </datatemplate>
    </gridview.itemtemplate>

Осмотрите синтаксис привязки. Поскольку мы находимся в DataTemplate для элемента GridView, наш DataContext - это не модель родительского представления (это объекты дочерних элементов). Если мы хотим привязать команду кнопки к модели родительского просмотра, нам нужна ссылка на что-то в нашем родительском представлении. В этом случае я назвал представление "ParentView". Используя синтаксис Binding ElementName, я мог бы привязываться к DataContext ParentView и, более конкретно, к свойству ParentViewModel.


Для этого есть два метода.

  • первый, который вы можете использовать, - привязать вашу кнопку к команде defined- в вашей родительской модели, где вы можете выполнять свою работу.
  • второй - вы можете использовать mvvm messenger class. в котором вам нужно отправить сообщение с вашей кнопки click handler на ваш viewmodel. когда вы получили это сообщение, добавьте к нему обработчик событий и выполните свою работу там.

licensed under cc by-sa 3.0 with attribution.