MVVM Light - Релейная команда с кнопками
Я данные, привязывающие некоторые кнопки к MapLayer. Они отображаются нормально, но когда я использую команду relay для передачи событийных сигналов от левой кнопки мыши Up, объекты-источники являются elipse. Я использовал этот метод на MapPolygon и получил нужную информацию от объекта.
Может быть, я плохо к этому отношусь, потому что я новичок в mvvm, поэтому, пожалуйста, дайте мне знать!
Это работает для моего MapPolygons (vm ссылается на пространство имен моего класса extendedMapPolygon)
<DataTemplate x:Name="polyTemplate">
<vm:extendedMapPolygon cName="{Binding _cName}" Locations="{Binding _Locations}" />
</DataTemplate>
Вот XAML в MapLayer
<m:MapItemsControl ItemTemplate="{StaticResource polyTemplate}" ItemsSource="{Binding Path=_PolyforDisplay, Mode=TwoWay}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonUp">
<cmd:EventToCommand Command="{Binding Path=PolySelCommand}" PassEventArgsToCommand="True" ></cmd:EventToCommand>
</i:EventTrigger>
</i:Interaction.Triggers>
</m:MapItemsControl>
На мой взгляд конструктор модели
PolySelCommand = new RelayCommand<MouseButtonEventArgs>(PolySelCommandExecute);
и, наконец, фактическая команда
public RelayCommand<MouseButtonEventArgs> PolySelCommand { get; set; }
private void PolySelCommandExecute(MouseButtonEventArgs cmp)
{
Polygon poly = cmp.OriginalSource as Polygon;
extendedMapPolygon ePoly = poly.Parent as extendedMapPolygon;
_MapPolygonSelected = ePoly.cName;
}
(Я поместил это здесь, чтобы показать и метод, который я использую в настоящее время, и в надежде, что он может быть полезным для других!)
Однако, когда я пытаюсь сделать то же самое с помощью канцелярской кнопки, cmp.OriginalSource представляет собой эллипс, и я никак не могу пройти через него.
Мой код канцелярской кнопки (в этом коде я просто использую канцелярские кнопки в MapControl)
<DataTemplate x:Name="ppTemplate">
<m:Pushpin ToolTipService.ToolTip="{Binding _psName}" Location="{Binding _Location}" />
</DataTemplate>
<m:MapItemsControl ItemTemplate="{StaticResource ppTemplate}" ItemsSource="{Binding Path=_PinsforDisplay, Mode=TwoWay}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonUp">
<cmd:EventToCommand Command="{Binding Path=pinSelCommand}" PassEventArgsToCommand="True" ></cmd:EventToCommand>
</i:EventTrigger>
</i:Interaction.Triggers>
</m:MapItemsControl>
Должен ли я использовать параметр команды? Или какой-то другой способ передачи текста моей модели представления, когда я нажимаю на канцелярскую кнопку, чего я и хочу на самом деле.
1 ответ
Я бы переместил курок на элемент канцелярской кнопки.
<DataTemplate x:Name="ppTemplate">
<m:Pushpin ToolTipService.ToolTip="{Binding _psName}" Location="{Binding _Location}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseEnter">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonUp">
<cmd:EventToCommand Command="{Binding Path=DataContext.pinSelCommand}"
CommandParameter="{Binding WhateverPropertyHasTheText" />
</i:EventTrigger>
</i:Interaction.Triggers>
</i:EventTrigger>
</i:Interaction.Triggers>
</m:Pushpin>
</DataTemplate>
Обратите внимание, что я передаю в качестве параметра команды любое свойство, которое вы хотите отправить из объектов в _PinsForDisplay. Кроме того, привязка для команды изменилась незначительно, так как привязка отличается от внутренней части таблицы данных.
И тогда вам придется изменить свою RelayCommand в модели представления на RelayCommand.
Я не тестировал этот код, но что-то очень похожее работает для меня, так что, надеюсь, оно может привести вас к решению.