MVVM Light - 带有Pushpins的Relaycommand

时间:2011-05-18 09:28:58

标签: silverlight mvvm-light bing-maps pushpin

我是将一些图钉绑定到MapLayer的数据。它们显示正常,但是当我使用relay命令从鼠标leftbuttonUp传递eventargs时,对象源是一个elipse。我在MapPolygon上使用了这个方法,并从对象中获取了我想要的信息。

因为我是mvvm的新手,也许我正在接受这个问题,所以请告诉我!

这适用于我的MapPolygons(vm引用我的extendedMapPolygon类的命名空间)

    <DataTemplate x:Name="polyTemplate">
        <vm:extendedMapPolygon cName="{Binding _cName}" Locations="{Binding _Locations}" />
    </DataTemplate>

这是MapLayer中的XAML

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

在我的viewModel构造函数

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是一个椭圆,我似乎无法通过任何其他东西。

我的图钉代码(我只是在本代码中使用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>

我应该使用命令参数吗?或者在我点击图钉时将文本传递到我的viewmodel的另一种方法,这就是我真正想要的。

1 个答案:

答案 0 :(得分:5)

我将触发器移动到图钉元素。

    <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中的对象发送的任何属性。此外,命令的绑定稍有改变,因为绑定与datatemplate内部不同。

然后你必须将viewmodel上的RelayCommand更改为RelayCommand。

我没有测试这段代码,但是非常类似的东西对我有用,所以希望它可以引导你找到解决方案。