2016-07-21 23 views
1

MainWindow ist an MainViewModel gebunden und der Rest ist an ChildViewModel gebunden, was eine Eigenschaft von MainViewModel ist. Jetzt im innersten untergeordneten Fenster, das an ChildViewModel gebunden ist, möchte ich eine Eigenschaft an MainViewModel binden.AncestorLevel funktioniert nicht beim Binden an das Ansichtsmodell des übergeordneten Fensters in WPF

Ich verwende den folgenden Code:

Hier ist der erste Wert des Converter ist verpflichtet, Eigentum C in ChildViewModel und es funktioniert. Ich habe versucht, den zweiten Wert an eine Eigenschaft an den DataContext von MainWindow (MainViewModel) ohne Erfolg zu binden.

<MultiBinding Converter="{StaticResource UnitConverter}"> 
    <Binding Path="C"/> 
    <Binding RelativeSource="{RelativeSource FindAncestor, 
     AncestorType={x:Type Window}, AncestorLevel=2}" 
      Path="DataContext.CurrentTargetUnit"/> 
</MultiBinding> 

--- Main Window ------------------------------------------- 
- ----- User Control 1 ------------------------------- - 
- - ---- User Control 2-------------------------- - - 
- - - ------ Child Window 1 ---------------- - - - 
- - - - ----- Child Window 2 ---------- - - - - 
- - - - -        - - - - - 
- - - - - [Bind to MainViewModel] - - - - - 
- - - - -        - - - - - 
- - - - ------------------------------- - - - - 
- - - -------------------------------------- - - - 
- - --------------------------------------------- - - 
- ---------------------------------------------------- - 
----------------------------------------------------------- 

Update:

Meine beste Vermutung ist, dass man nur an das übergeordnete Fenster binden kann und nicht mehr als das. Vielleicht ist das oberste Fenster nicht im visuellen Baum?

Antwort

1

Erstellen Sie eine Eigenschaft auf der ChildViewModel, die eine referenzielle Verbindung zu der MainViewModel ist. Nach der Instanziierung der untergeordneten VM verknüpfen Sie sie mit der MainViewModel. Dann können die internen Fenster/Steuerelemente zu dem MainViewModel durch Verweisen auf die zuvor erwähnte ChildViewModel Eigenschaft zu dem Haupt-VM gelangen.


Auf dem Benutzer Control1 und 2 eine Abhängigkeitseigenschaft der Hauptansicht Modells Typs erstellen wie:

// <summary> 
/// Holds the parent VM here. 
/// </summary> 
public MainVM ParentVM 
{ 
    get { return GetValue(ParentVMProperty) as MainVM; } 
    set { SetValue(ParentVMProperty, value); } 
} 

    /// <summary> 
    /// Identifies the ParentVM dependency property. 
    /// </summary> 
    public static readonly System.Windows.DependencyProperty ParentVMProperty = 
     System.Windows.DependencyProperty.Register(
      "ParentVM", 
      typeof(MainVM), 
      typeof({Insert Control1 or 2 class type here}), 
      new System.Windows.PropertyMetadata(null, OnParentVMPropertyChanged)); 

    /// <summary> 
    /// ParentVMProperty property changed handler. 
    /// </summary> 
    /// <param name="d">BeginRandom that changed its ParentVM.</param> 
    /// <param name="e">Event arguments.</param> 
    private static void OnParentVMPropertyChanged(System.Windows.DependencyObject d, System.Windows.DependencyPropertyChangedEventArgs e) 
    { 
     var source = d as {Insert Control1 or 2 class type here}; 
     MainVM value = e.NewValue as MainVM; 
    } 

Da jedes Fenster eine Referenz zur Verfügung, die MainWindowVM haben wird, alle müssen Sie tun ist der Pfad zur ParentVM Eigenschaft des aktuellen Fensters.


Beachten Sie, dass Kontrolle der Abhängigkeitseigenschaft Ich verwende die handlichen Schnipsel zu erstellen, für Silverlight geschrieben, aber alle von ihnen Arbeit in WPF:

Helpful Silverlight Snippets - Jeff Wilcox

+0

Es hat nicht funktioniert. Es scheint, dass das Elternfenster auf diese Weise nicht erkannt wird. Ich habe dies auch verwendet, um es ohne Erfolg zu überprüfen. '

+0

@Vahid Wie instanziiert das Hauptfenster die untergeordneten Fenster? – OmegaMan

+0

Das Ansichtsmodell des 'MainWindow' wird im Code dahinter instanziiert, und dann habe ich Benutzersteuerelemente im' MainWindow', deren Datenkontexte in XAML instanziiert und an untergeordnete Fenster im Code-Behind übergeben werden. Bis jetzt funktioniert alles sehr gut, abgesehen von diesem Problem, das ich das Elternfenster nicht erkennen kann. Ich kann "Child Window 1" von "Child Window 2" erkennen, aber keine obere. – Vahid