将 XAML Map 控件绑定到 Code behind
Bind XAML Map control to Code behind
说明:
我不能使用代码隐藏,因为我正在使用一些注入 Ninject 的接口,我不能只做 service = new service() 因为那个背后有更多的依赖关系。至于关于类型名称作为转换器参数的问题,我发现这个解决方案最适合将我的模型绑定到我的 UI。我将它用于我的所有模块并且运行良好。只是我的地图控件根本不起作用。
Atm 我正在尝试在我的 Windows Phone 8 应用程序中包含一个 Microsoft.Phone.Maps.Controls.Map 控件。但我似乎无法让它工作。
由于依赖注入和其他东西,我无法使用 xaml 页面后面的代码。因此,我为自己创建了一个 MapController,它作为 DataContext linked 到 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 之间的 link 正在工作(使用简单的布尔绑定对其进行了测试)。当我调试 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 的依赖项 属性 来解决我的问题。
这样,当我的 Location 得到更新时,它将触发 Dependency 属性 属性ChangedCallback.
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 中是地图控件,这样就可以使用 MapControl 上的 SetView() 方法:)
我花了一段时间才得到这个解决方案,所以无论如何我都想分享它
说明: 我不能使用代码隐藏,因为我正在使用一些注入 Ninject 的接口,我不能只做 service = new service() 因为那个背后有更多的依赖关系。至于关于类型名称作为转换器参数的问题,我发现这个解决方案最适合将我的模型绑定到我的 UI。我将它用于我的所有模块并且运行良好。只是我的地图控件根本不起作用。
Atm 我正在尝试在我的 Windows Phone 8 应用程序中包含一个 Microsoft.Phone.Maps.Controls.Map 控件。但我似乎无法让它工作。
由于依赖注入和其他东西,我无法使用 xaml 页面后面的代码。因此,我为自己创建了一个 MapController,它作为 DataContext linked 到 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 之间的 link 正在工作(使用简单的布尔绑定对其进行了测试)。当我调试 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 的依赖项 属性 来解决我的问题。 这样,当我的 Location 得到更新时,它将触发 Dependency 属性 属性ChangedCallback.
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 中是地图控件,这样就可以使用 MapControl 上的 SetView() 方法:)
我花了一段时间才得到这个解决方案,所以无论如何我都想分享它