繁体   English   中英

将XAML Map控件绑定到背后的代码

[英]Bind XAML Map control to Code behind

解释:我不能在后面使用代码,因为我正在使用一些用Ninject注入的接口,我不能只做service = new service(),因为在那个后面有更多的依赖关系。 至于类型名称作为转换器参数的问题,我发现此解决方案最适合将模型绑定到UI。 我将其用于所有模块,并且运行良好。 只是我的地图控件根本不起作用。

Atm我正在尝试在Windows Phone 8应用程序中包含Microsoft.Phone.Maps.Controls.Map控件。 但是我似乎无法正常工作。

由于依赖注入和其他东西,我无法使用xaml页面后面的代码。 因此,我使自己成为了一个MapController,它作为数据上下文链接到Xaml。 但是我有一些问题。

XAML:

<phone:PhoneApplicationPage
    ...
    xmlns:maps="clr-namespace:Microsoft.Phone.Maps.Controls;assembly=Microsoft.Phone.Maps"
    DataContext="{Binding Source={StaticResource DynamicLocator}, Converter={StaticResource IndexConverter}, ConverterParameter='BaseCpr.Plugins.ShopLocator.Model.MapController,BaseCpr.Plugins'}">

    <Grid>
         <maps:Map DataContext="{Binding MapControl, Mode=TwoWay}">
        </maps:Map>
    </Grid>
</phone:PhoneApplicationPage>

MapController:

public MapController(IService Service) {
    //Service is used here a lot

    MapControl = new Map() {
        CartographicMode = MapCartographicMode.Road,
        Heading = 0,
        Pitch = 0,
        ZoomLevel = 7,
        Center = new GeoCoordinate(50.50, 4.000)
    };
}

private Map mapControl;
public Map MapControl {
    get { return mapControl; }
    set {
        if (mapControl != value) {
            mapControl = value;
            RaisePropertyChanged(() => MapControl);
        }
    }
}

XAML和我的MapController之间的链接正在工作(已通过简单的布尔绑定进行了测试)。 当我调试MapControl的吸气剂时,将被调用。 但是,我在屏幕上的地图仍处于默认视图。 有人可以帮我解决我的错吗?

谢谢

编辑2 :(一些更多信息)在我的MapController中,我也具有以下功能:

public async void getPhoneLocation() {
    try
    {
        //getting location and put it in geoposition

        var cord = new GeoCoordinate(geoposition.Coordinate.Latitude, geoposition.Coordinate.Longitude);
        MapControl.SetView(cord, 16, 0, 0, MapAnimationKind.Parabolic);
        CreateAndAddUserMarker(cord);
    }
    catch (Exception ex)
    {
        //TODO
    }
}

这就是为什么我不能只绑定XAML映射控件的所有Map属性的原因。 我还需要调用SetView()函数。 我还需要在地图上添加图层,以在地图上添加图钉。 在MapController构造函数中调用getPhoneLocation()。

通过制作MapBehavior并将ViewModel属性绑定到MapBehavior的Dependency属性来解决我的问题。 这样,当我的位置信息更新时,它将触发依赖项属性PropertyChangedCallback。

 public DependencyProperty LocationProperty = DependencyProperty.Register(
"Location", typeof(GeoCoordinate), typeof(MapBehavior), new PropertyMetadata(null, (sender, args) =>
{
    if (args.NewValue != null && args.NewValue != args.OldValue)
    {
        var sendMap = ((MapBehavior)sender);
        sendMap.AssociatedObject.SetView((GeoCoordinate)args.NewValue, 14, 0, 0, MapAnimationKind.Parabolic);
    }
}));

发送方是Map控件,因此可以使用MapControl上的SetView()方法:)

我花了一些时间才得到这个解决方案,所以我还是想分享一下

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM