我正在实施一个wpf控件,它提供了在Web浏览器中运行的xaml和Google Maps之间的一些通用绑定。目前,绑定是单向的,并且工作正常。
接下来我需要做的是在指定双向绑定时将值写回视图模型。我开始使用的属性是谷歌地图的缩放。当它在浏览器中被更改时,我可以在页面上运行js,该页面使用新的缩放级别回调我的C#代码。
向DP提供此新值的正确方法是什么?如果选择双向绑定,它将更新视图模型的缩放级别?
我目前的缩放级别DP代码:
#region ZoomProperty
//Called from the web page
private JSValue MapZoom_OnMapZoomChanged(JSValue[] arguments) {
string zoom = arguments[0];
//where do I set the zoom so that the view model bound property is updated?
return null;
}
public static readonly DependencyProperty ZoomProperty =
DependencyProperty.Register("Zoom", typeof(string), typeof(GoogleMap), new FrameworkPropertyMetadata(string.Empty, OnZoomPropertyChanged), OnZoomPropertyValidate);
public string Zoom {
get { return (string)GetValue(ZoomProperty); }
set { SetValue(ZoomProperty, value); }
}
private static bool OnZoomPropertyValidate(object value) {
return value is string;
}
private static void OnZoomPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) {
GoogleMap control = source as GoogleMap;
control.SetZoom(e.NewValue.ToString());
}
private string zoom;
public void SetZoom(string value) {
if (!googleMapPageReady) {
zoom = value;
return;
}
webControl.ExecuteJavascript(string.Format("setZoom({0})", zoom));
}
#endregion
答案 0 :(得分:2)
除非我忽视某些事情,否则你只需要这样做:
private JSValue MapZoom_OnMapZoomChanged(JSValue[] arguments)
{
string newZoom= arguments[0];
this.Zoom = newZoom; // here
return null;
}
设置依赖项属性模式,以便从外部可以将Zoom视为普通的c#属性(setter和getter)。如果你查看该属性的setter,它会调用SetValue(),它位于DependencyObject基类上,并且可以通过绑定引擎通知更改(另请参阅:Register())
<强>更新强>
当地图是首先提供更改的地图时,一种阻止更改将更新发送到地图的简单方法:
private bool IsMapUpdateSuppressed = false;
private JSValue MapZoom_OnMapZoomChanged(JSValue[] arguments)
{
string newZoom= arguments[0];
this.IsMapUpdateSuppressed = true;
this.Zoom = newZoom;
this.IsMapUpdateSuppressed = false;
return null;
}
private static void OnZoomPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
GoogleMap control = source as GoogleMap;
if (!control.IsMapUpdateSuppressed)
{
control.SetZoom(e.NewValue.ToString());
}
}
这允许DP值像往常一样更改,处理和通知绑定引擎,但只是阻止调用SetZoom