【发布时间】:2015-03-25 02:26:19
【问题描述】:
说明: 我不能使用后面的代码,因为我正在使用一些用 Ninject 注入的接口,我不能只做 service = new service() 因为在那个后面有更多的依赖项。至于关于类型名称作为转换器参数的问题,我发现这个解决方案最适合将我的模型绑定到我的 UI。我将它用于我的所有模块并且效果很好。只是我的地图控件根本不起作用。
Atm 我正在尝试在我的 Windows Phone 8 应用程序中包含一个 Microsoft.Phone.Maps.Controls.Map 控件。但我似乎无法让它工作。
由于依赖注入和其他东西,我无法使用我的 xaml 页面背后的代码。所以我给自己做了一个 MapController,它作为 DataContext 链接到 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>
地图控制器:
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 的 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() 函数。我还需要向我的地图添加图层以在地图上添加图钉。在 MapController 构造函数中调用 getPhoneLocation()。
【问题讨论】:
-
您正在将 maps:Map DataContext 设置为 Map 的一个实例。这不是它的工作原理。这不是任何工作的方式。类型名称作为转换器参数?呜呜?你需要退后一步,因为这些都不正确。你需要用地图做什么?您面临哪些阻止使用代码隐藏的限制? Edit 并将这些详细信息添加到问题的顶部。答案将是解决此问题的方法,而不是尝试修复您拥有的东西(修复它是不可能的)。
-
如果不是 Map 实例我应该绑定什么?
-
您应该通过 ViewModel 中的 INPC 属性公开服务,然后将它们绑定到 Window 上的 DependencyProperties,然后在您的代码隐藏中使用它们,很可能。但我不确定这是否是你真正的问题,因为我的阅读理解能力很差。
-
在我的地图控制器中,我可以调用 RaisePropertyChanged() 来让我的 UI 知道它已经改变了。但由于某种原因,我的地图控制并没有像我预期的那样改变。我的绑定本身正在工作我只是不确定它是否也适用于地图控件。
-
这很容易实现。问题是您的问题不包含有关何时以及为何需要调用 SetView 的任何信息。再次,阅读我的第一条评论。详细说明您需要完成什么以及为什么不能完成(不能使用绑定来调用事件似乎是您的问题),并且有人可以告诉您如何实现您的目标。
标签: c# xaml windows-phone-8 data-binding