| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > WPF и Silverlight > MVVM и привязка к DataTemplate |
| Автор: Rohoss 5.5.2011, 14:57 | ||
| Есть View - это окно, и соответственно ViewModel. Дальше у нас в окне расположен ListView, который биндится к данным ViewModel. В ListView есть дататемплейт, который отрисовывает кнопку. К Кнопке привязана команда, которая находится в ViewModel. Примерно так:
Я хочу, чтобы при нажатии на кнопку сработала привязанная команда и произвела действие над объектом, который привязан к данному итему. То есть, у меня не получается передать сам объект, который привязан к данной кнопке в ViewModel, для того чтобы произвести над ним манипуляции. Можно конечно привязывать SelectedItem и получать его при клике, но не факт что клик будет на кнопке выделенного элемента... |
| Автор: -Mikle- 6.5.2011, 06:24 | ||
Все очень просто:
Но тут есть еще один момент, ваша команда раположена в самом айтеме? Потому что вы биндитесь к текущему контексту данных, которым будет являться в этом случае сам айтем, а не модель представления. Для того чтобы забиндить в данном случае команду, надо явно прописать у биндинга Source на вашу модель. |
| Автор: -Mikle- 6.5.2011, 12:48 | ||||
Это то, что вам нужно. Задав параметр таким образом, вы будете передавать в команду датаконтекст кнопки, то бишь конкретного итема, а не SelectedItem.
Попробую еще объяснить по другому. У листвью DataContext задан как ваша модель, ок. Когда листвью генерит контейнеры (фактически ListViewItem) для итемов списка в вашей модели, он ложит созданному ListViewItem.DataContext = <итем из списка>. Далее, ваша кнопка полчается находится в контексте конкретного ListViewItem, а это значит в контексте конкретного айтема в списке, а не в контексте SelectedItem. |
| Автор: Rohoss 6.5.2011, 12:54 |
| -Mikle-, спасибо Всё дело в том, что я не знал как передаётся CommandParamete, я думал его тоже надо привязывать к ViewModel чтобы потом обрабатывать при вызове команды. А он оказывается передается параметром Execute. Тогда всё правильно и удобно получается. Спасибо. |
| Автор: -Mikle- 6.5.2011, 12:59 |
| Не за что, всегда рад |