MVVM Light — релейная команда с кнопками

Я привязываю данные к MapLayer. Они отображаются нормально, но когда я использую команду relaycommand для передачи аргументов события от левой кнопки мыши вверх, источники объекта представляют собой многоточие. Я использовал этот метод на 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;
    }

(Я разместил это здесь, чтобы показать метод, который я использую в настоящее время, и в надежде, что он может быть полезен другим!)

Однако, когда я пытаюсь сделать то же самое с Pushpin, cmp.OriginalSource представляет собой эллипс, и я не могу передать что-либо еще.

Мой код Pushpin (я просто использую Pushpins в 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>

Должен ли я использовать параметр команды? Или какой-то другой способ передачи текста в мою модель представления, когда я нажимаю на канцелярскую кнопку, чего я действительно хочу.


person Jas    schedule 18.05.2011    source источник
comment
Какой текст вы пытаетесь передать команде в модели представления? Это свойство объектов в _PinsforDisplay?   -  person schummbo    schedule 27.05.2011
comment
Да - некоторый текст, который хранится в свойстве   -  person Jas    schedule 01.06.2011


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

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

person schummbo    schedule 26.05.2011
comment
Спасибо за ваш ответ - я попробую это в течение следующих нескольких дней и отпишусь - person Jas; 01.06.2011
comment
Извините за опоздание с ответом - время ушло от меня. Кажется, я не могу заставить это работать. Я получаю эту ошибку. Добавление значения в коллекцию типа «System.Windows.Interactivity.TriggerCollection» вызвало исключение Как бы я ни пытался добавить триггер в шаблон данных. Я урезал свой код до минимума, но все равно без радости — есть идеи? Спасибо за вашу помощь - person Jas; 10.06.2011
comment
Мне пришлось добавить ElementName=LayoutRoot, чтобы это сработало, но это сработало! Спасибо за вашу помощь. Command={Binding DataContext.pinSelCommand, ElementName=LayoutRoot} - person Jas; 20.06.2011