C# 将XAML映射控件绑定到代码隐藏

C# 将XAML映射控件绑定到代码隐藏,c#,xaml,windows-phone-8,data-binding,C#,Xaml,Windows Phone 8,Data Binding,说明: 我不能使用代码隐藏,因为我使用的是一些注入了Ninject的接口,我不能只使用service=new service(),因为在这个接口后面有更多的依赖项。至于类型名作为转换器参数的问题,我发现这个解决方案最适合将模型绑定到UI。我在我所有的模块中都使用了这个,并且工作得很好。只是我的地图控件根本不起作用 Atm我正在尝试在我的Windows Phone 8应用程序中包含Microsoft.Phone.Maps.Controls.Map控件。但我似乎无法让它工作 由于依赖注入等原因,我无

说明: 我不能使用代码隐藏,因为我使用的是一些注入了Ninject的接口,我不能只使用service=new service(),因为在这个接口后面有更多的依赖项。至于类型名作为转换器参数的问题,我发现这个解决方案最适合将模型绑定到UI。我在我所有的模块中都使用了这个,并且工作得很好。只是我的地图控件根本不起作用

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

由于依赖注入等原因,我无法使用xaml页面的代码隐藏。因此,我为自己制作了一个MapController,它作为DataContext链接到Xaml。但我有一些问题

XAML:

XAML和我的MapController之间的链接正在工作(使用简单的布尔绑定进行了测试)。当我调试MapControl的getter时会被调用。但我屏幕上的地图仍处于默认视图。有人能帮我找出我做错了什么吗

谢谢

编辑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映射控件的所有映射属性。我还需要调用SetView()函数。我还需要在地图上添加图层,以便在地图上添加图钉。getPhoneLocation()在MapController构造函数中调用。

通过创建MapBehavior并将ViewModel属性绑定到MapBehavior的依赖项属性来解决我的问题。 这样,当我的位置得到更新时,它将触发依赖属性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);
    }
}));
在sender中是Map控件,这样就可以使用MapControl上的SetView()方法:)


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

您正在将maps:Map-DataContext设置为Map的一个实例。事情不是这样的。这些都不是这样的。以及类型名称作为转换器参数?乌乌特?你需要退后一步,因为这些都不正确。你需要用这张地图做什么?您面临哪些限制来阻止使用codebehind?并将这些细节添加到问题的顶部。答案将是这个问题的解决方案,而不是试图修复您所拥有的(修复它是不可能的)。因此,如果它不是地图实例,那么我应该绑定到什么?您应该通过ViewModel中的INPC属性公开服务,然后将这些服务绑定到窗口上的DependencyProperties,并很可能在代码隐藏中使用它们。但我不确定这是否是你真正的问题,因为我的阅读理解能力很差。在我的地图控制器中,我可以调用RaisePropertyChanged()让我的UI知道它已经改变了。但由于某些原因,我的地图控制并没有像我预期的那样改变。我的绑定本身正在工作,我只是不确定它是否也适用于映射控件。这很容易实现。问题是,您的问题没有包含任何关于何时以及为什么需要调用SetView的信息。再次阅读我的第一条评论。详细说明您需要完成什么以及为什么不能完成(不能使用绑定调用事件似乎是您的问题),然后有人可以告诉您如何实现目标。
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
    }
}
 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);
    }
}));