2016-07-14 72 views
0

我正在實現一個wpf控件,該控件提供了在web瀏覽器中運行的xaml和Google Maps之間的一些常見綁定。目前,綁定是單向的,工作正常。在雙向綁定中將視圖模型的依賴項屬性值寫回

接下來我需要做的是在指定雙向綁定時將值寫回視圖模型。我開始使用的是Google Map的縮放。當它在瀏覽器中更改時,我可以在頁面上運行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

作爲一個註釋,你也可以設置'FrameworkPropertyMetadataOptions.BindsTwoWayByDefault'標誌和Register方法的另一個重載,以使默認情況下雙向綁定依賴屬性。 – Clemens

回答

2

除非我忽視的東西,你只需要做:

private JSValue MapZoom_OnMapZoomChanged(JSValue[] arguments) 
{ 
    string newZoom= arguments[0]; 
    this.Zoom = newZoom; // here 
    return null; 
} 

依賴屬性模式設置,使從外面你可以把Zoom作爲一個普通的c#屬性(setter和getter)。如果你看一下制定者調用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的調用

+0

我想這是我的困惑 - 我需要警惕OnZoomPropertyChanged在這種情況下再次被調用?縮放值來自地圖,因此不需要再次設置。 – jchristof

+1

不會再次調用OnZoomPropertyChanged,除非Zoom屬性的值確實發生更改。 – Clemens

+0

你在xaml中實際綁定了什麼? – plast1k

相關問題