WPF MVVM: Узнайте, по какому контекстному меню заголовка щелкнули - PullRequest
3 голосов
/ 21 июля 2009

Я пытаюсь использовать шаблон MVVM для написания приложения WPF. Я использую сетку данных WPF (из набора инструментов), в которой отсутствует функция автофильтрации. Поэтому я хочу это реализовать. Я добавил контекстное меню в шаблон заголовка столбца, у него есть MenuItem с именем «Фильтр», который на самом деле должен вызывать метод фильтрации.

Итак, я установил команду MenuItem в качестве соответствующего DelegateCommand, который идет в ViewModel. Проблема в том, что мне нужно передать информацию о фактическом столбце, который был щелкнуть правой кнопкой мыши! Если бы я не использовал MVVM, я бы реализовал обработчик событий, который получал бы аргумент «отправитель» (MenuItem), затем я бы нашел его родителя (ContextMenu), тогда его родитель дал бы мне столбец. Но как я могу добиться того же здесь? Как я могу передать отправителя моей команде? Можно ли это сделать с помощью ComandParameter?

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

Ответы [ 3 ]

1 голос
/ 21 июля 2009

Можете ли вы передать значение заголовка столбца в качестве параметра команды и использовать его для получения сведений о столбце в ViewModel?

0 голосов
/ 22 июля 2009

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

<MenuItem CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=DataContext}" />

должен получить GridViewColumnHeader или хотя бы что-то в его визуальном дереве.

0 голосов
/ 21 июля 2009

Вы можете попробовать некоторую относительную магию источника, но вам будет проще, если у вас будет другой ViewModel, к которому вы привязываете каждый заголовок, например HeaderViewModelItem. Оттуда вы просто будете запускать DelegateCommand в вашем HeaderViewModelItem, а не в вашей более крупной модели представления.

Я использовал эту модель с довольно хорошим успехом. Получает немного танца связывания данных.

...