2016-07-14 7 views
0

xamlとWebブラウザーで実行されているGoogleマップとの共通バインドを提供するwpfコントロールを実装しています。現在、バインディングは一方通行であり、正常に動作しています。双方向バインディングでビューモデルに依存プロパティー値を書き戻す

双方向バインディングが指定されている場合、ビューモデルに値を書き戻す必要があります。私が始めているプロパティは、Googleマップのズームです。ブラウザで変更されたら、新しいズームレベルでC#コードを呼び出すページでjsを実行できます。

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)として扱うことができます。あなたがそのプロパティのセッターを見れば、それはのDependencyObject基本クラスであり、変更のバインディングエンジンに通知するための魔法をしている、SetValue()を呼び出します(参照:Register()

更新

Aマップは最初の場所に変化を与えるものであった場合、マップに更新を送信変化を防止する簡単な方法:

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

Zoomプロパティの値が実際に変更されていない限り、OnZoomPropertyChangedは再び呼び出されません。 – Clemens

+0

xamlでは実際に何にバインドしていますか? – plast1k

関連する問題