Windows Phone 8.1中MapControl Center属性的数据绑定

时间:2015-04-03 12:22:45

标签: c# xaml mvvm windows-phone-8.1 bing-maps

我正在开发一个带有MVVM Light的Windows Phone 8.1(winRT)应用程序和一个使用MapControl的PCL。 我遇到了MapControl Center属性绑定的问题。 在应用程序初始化时,属性在ViewModel中设置,并且地图正确居中。

但是,当我更新ViewModel中的值时,地图不会重新居中,但如果我将值绑定到文本块,则会正确更新。

XAML:

<Maps:MapControl BorderThickness="2" BorderBrush="Black"
        x:Name="Map" 
        HorizontalAlignment="Right" Margin="0,45,0,0" 
        VerticalAlignment="Top" 
        Height="595"  Width="400"
        ZoomLevel="10"
        LandmarksVisible = "False"
        TrafficFlowVisible = "False"
        PedestrianFeaturesVisible = "False"
        Center="{Binding Path=ViewStoreModel.CenterPosition, Mode=OneWay, Converter={StaticResource NormalizedAnchorPointConverter}}"
        MapServiceToken="{StaticResource MapServiceTokenString}">

            <Maps:MapItemsControl x:Name="MapIcons" ItemsSource="{Binding ViewStoreModel.ListStoreSearch}"  >
                <Maps:MapItemsControl.ItemTemplate>
                    <DataTemplate x:Name="Temp" >
                        <StackPanel Tapped="Image_Tapped" x:Name="MyStack"  Maps:MapControl.Location="{Binding store_position, Converter={StaticResource GeoPointConvertCenter}}">
                            <Image x:Name="PinsImage" Source="ms-appx:///Assets/map-pin-button.png" />
                        </StackPanel>
                    </DataTemplate>
                </Maps:MapItemsControl.ItemTemplate>
            </Maps:MapItemsControl>
        </Maps:MapControl>

ViewModel的属性:

    public Location CenterPosition
        {
            get
            { 
                return _centerPosition;
            }
             set
            {
              Set(CenterPositionPropertyName, ref _centerPosition, value);
            }
        }

public class Location : ObservableObject
{
    public const string latitudePropertyName = "latitude";
    public const string longitudePropertyName = "longitude";
    private double _latitude;
    private double _longitude;
    public double latitude
    {
        get
        {
            return _latitude;
        }
        set
        {
            Set(latitudePropertyName, ref _latitude, value);
        }

    }
    public double longitude
    {
        get
        {
            return _longitude;
        }
        set
        {
            Set(longitudePropertyName, ref _longitude, value);
        }
    }

属性中心是Geopoint类型,因此我使用转换器将其从自定义类Location转换。 Center是一个依赖属性,因此它应该是可绑定的。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

我发现MapControl中存在一些错误。 问题来自绑定模式。 OneWay似乎像OneTime一样工作(仅在init)。 如果我使用TwoWay它可以工作,但地图正在不断更新ViewModel。

作为一种解决方法,我指定在XAML必须更新源时必须明确说明。

代码:

<Maps:MapControl BorderThickness="2" BorderBrush="Black"
        x:Name="Map" 
        HorizontalAlignment="Right" Margin="0,45,0,0" 
        VerticalAlignment="Top" 
        Height="595"  Width="400"
        ZoomLevel="10"
        LandmarksVisible = "False"
        TrafficFlowVisible = "False"
        PedestrianFeaturesVisible = "False"
        Center="{Binding ViewStoreModel.CenterPosition, Mode=TwoWay, UpdateSourceTrigger=Explicit, Converter={StaticResource NormalizedAnchorPointConverter}}"
        MapServiceToken="{StaticResource MapServiceTokenString}"
        >

答案 1 :(得分:1)

我们采用了一种不同的方法 我们使用了DataContext的PropertyChanged事件 - 我们在处理程序中检查e.PropertyName是否等于CurrentLocation,如果确实如此,我就是{{1} }}。
这样,当CurrentLocation发生变化时,地图会为新位置获得一个漂亮而流畅的动画。

答案 2 :(得分:0)

您是否尝试删除&#34; Path&#34;属性并将其直接绑定到您的ViewModel?

<Maps:MapControl Center="{Binding ViewStoreModel.CenterPosition, Mode=OneWay, Converter={StaticResource NormalizedAnchorPointConverter}}"/>