GalaSoft_MvvmLight_Command: EventToCommand для кнопки в ListItem? - PullRequest
1 голос
/ 04 августа 2011

Каков синтаксис подключения EventToCommand mvvm-light к позиции в шаблоне данных?Для действия над основной моделью синтаксис, подобный приведенному ниже, работает нормально, однако, если я выполняю операцию над элементом строки в шаблоне данных, привязка не работает, и мне нужно определить конкретную позицию для работы,

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

Ошибка времени выполнения в выходных данных: System.Windows.Data Ошибка: ошибка пути BindingExpression: свойство 'EditLineCommand' не найдено в 'Model.LineItem'.BindingExpression: Path = 'EditLineCommand' DataItem = 'Model.LineItem';целевым элементом является System.Windows.Controls.Button (Name = 'EditRowButton');Свойство target - 'DependencyPropertyListener39' (тип 'System.Object') ..

XAML main layout:
<!-- Line Items -->
<ListBox ItemTemplate="{StaticResource LineItemTemplate}" ItemsSource="{Binding Model.LineItems}"/>

XAML data template:
<DataTemplate x:Key="LineItemTemplate">
<Button>
<Image Source="..." />
<Custom:Interaction.Triggers>
<Custom:EventTrigger EventName="Click">
<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding EditLineCommand, Mode=OneWay}" />
</Custom:EventTrigger>
</Custom:Interaction.Triggers>
</Button>
</DataTemplate>

Обновление - мне кажется, я почти на месте, ответ @Claus дал мне большую частьпутем решения проблемы связывания команд.Чтобы определить конкретную линию для работы, я связываюсь с LineNumber объекта LineItem, а затем извлекаю этот параметр из команды реле:

<GalaSoft_MvvmLight_Command:EventToCommand 
Command="{Binding DataContext.DeleteLineCommand, ElementName=DetailPage}"                                                                       
CommandParameter="{Binding LineNumber}"
PassEventArgsToCommand="True" />

...

public RelayCommand<int> DeleteLineCommand { get; private set; }

...

DeleteLineCommand = new RelayCommand<int>((ln) => { DeleteLineItem(ln); });

Это работоспособное решение, но есть ли способ привязки к полному LineItem, а не просто к члену?

Ответы [ 2 ]

1 голос
/ 04 августа 2011

См. Привязка сетки данных к одной ViewModel, столбцу / комбинированному списку с другим для обсуждения того, как связать свойство (или команду) модели представления из шаблона данных.

0 голосов
/ 04 августа 2011

Магический трюк:

<phone:PhoneApplicationPage x:Name="MyPage" ... >
    ...
    <GalaSoft_MvvmLight_Command:EventToCommand 
        Command="{Binding DataContext.EditLineCommand, ElementName=MyPage}" />
    ...
</phone:PhoneApplicationPage>

Таким образом, он будет использовать DataContext страницы, который обычно является вашей моделью представления.

...