2016-01-18 2 views
0

Я работаю над подобным приложением для покупок как способ практиковать шаблон дизайна MVVM.MVVM ICommand Связывание «выше вверх»

У меня есть вид которого ViewModel довольно много всего ShoppingCart и ShoppingCart в первую очередь список продукта с.

Сейчас мой вид показывает продуКтов в GridView, который использует DataTemplate, чтобы показать Имя, Цены и кнопка Remove для каждого продукта. Дело в том, из-за привязки данных, если я пытаюсь привязки данных в Command атрибута кнопки Удалить в RemoveCommand недвижимости в моем ViewModel, код не потому, что он ищет RemoveCommand в продукте класса вместо ViewModel класс.

Я очень сомневаюсь, что я хочу сломать герметизацию и имею продукт дела с удалением себя от ShoppingCart, но я не могу показаться, чтобы выяснить правильный путь для решения этой проблемы.

+0

Нам нужно увидеть ваши классы ViewModel, View и Product. –

+0

Хотя это отличная идея, если я ударяю блок-шестерку синтаксиса, я действительно ищу общее, основанное на концепции решение, вместо того, чтобы кто-то выплюнул код для копирования. Вот почему я целенаправленно воздержался от публикации XAML/C#. – afding

ответ

2

Дайте вашему GridView имя и сделайте Command="{Binding ElementName=theGridView, Path=DataContext.RemoveCommand}". Вы также можете использовать привязку RelativeSource, хотя я думаю, что первая быстрее.

Вы также захотите передать сам продукт в обработчик команд, чтобы вы знали, на какой из них пользователь нажал, сделайте это с помощью CommandParameter="{Binding Path=.}". Свойство RemoveCommand должны быть объявлены для возврата типа ICommand, но должен возвращать общий экземпляр RelayCommand т.е .:

public ICommand RemoveCommand { get { return new RelayCommand<Product>(OnRemove); } } 
private void OnRemove(Product product) 
{ 
    // remove it here 
} 
+0

Да! Похоже, мне нужно возиться с моей реализацией ICommand, так как сейчас я использую тип Action, который не позволяет CommandParameters. Но я думаю, что это намного проще, если я использую CommandParameter, так как тогда мне не нужно привязываться к CurrentSelectedProduct в ViewModel. – afding

+0

@afding это лучшее решение. Кроме «Путь =.» является избыточным. {Связывание} достаточно. Использование 'ElementName' лучше, чем использование привязки RelativeSource. – Will

1

использование RelativeSource (предка) связывание в качестве общего раствора.

Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type GridView}}, Path=DataContext.RemoveCommand}" 

Таким образом, я надеюсь, что класс, который имеет вид gridview как datacontext, содержит эту команду RemoveCommand. Или еще в AncestorType поместите элемент управления с таким datacontext, который содержит команду RemoveCommand.

Возможно, вы сохранили свою инкапсуляцию и привязку.

+1

RemoveCommand определен в viewmodel (DataContext GridView), а не в самом GridView. Вероятно, вы имели в виду «Path = DataContext.RemoveCommand» – Liero

+0

да, dats rit .... должен быть DataContext.RemoveCommand. –

Смежные вопросы