在双向绑定中将依赖项属性值写回视图模型

时间:2016-07-14 16:55:14

标签: c# wpf xaml dependency-properties

我正在实施一个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

1 个答案:

答案 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