MVVM Light - Релейная команда с кнопками - PullRequest
2 голосов
/ 18 мая 2011

Я привязываю данные некоторых кнопок к MapLayer. Они отображаются нормально, но когда я использую команду relay для передачи событийных сигналов от левой кнопки мыши Up, объекты-источники являются elipse. Я использовал этот метод на MapPolygon и получил нужную информацию от объекта.

Может быть, я плохо к этому отношусь, поскольку я новичок в mvvm, поэтому, пожалуйста, дайте мне знать!

Это работает для моих MapPolygons (vm ссылается на пространство имен моего расширенного класса MapPolygon)

    <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 Ответ

5 голосов
/ 27 мая 2011

Я бы переместил триггер на элемент pushpin.

    <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.

Я не сделалНе тестируйте этот код, но что-то очень похожее работает для меня, так что, надеюсь, оно может привести вас к решению.

...