2016-06-24 9 views
1

Ich habe einen WPF-Dialog, und ich versuche, auf eine Eigenschaft im ViewModel des Eigentümers zuzugreifen.WPF-Dialog Relative Quellenbindung (MVVM)

Ich habe folgendes versucht, aber es bindet an das Ansichtsmodell des Dialogs:

<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, 
     AncestorType={x:Type Window}}, Path=Owner.DataContext.Property}"/> 

Aber es gibt das gleiche Ergebnis:

<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, 
     AncestorType={x:Type Window}}, Path=DataContext.Property}"/> 

ich auch versucht.

Der Code Benutzer den Dialog zu erzeugen, ist:

 var dialog = new Dialog(DialogViewModel) 
     { 
      Owner = Window.GetWindow(this) 
     }; 

ich einige Fragen in Stackoverflow gesehen habe, aber keiner scheint zu funktionieren.

Irgendwelche Ideen? Und ist es möglich, eine relative Quelle in einem Dialog zu haben?

+0

Ich würde erwarten, 'Owner.DataContext.Property' zu funktionieren, wie in Ihrem zweiten Beispiel, aber hinzufügen' .Property'. –

+0

Es war ein Tippfehler, danke. –

+0

Sorry ich habe die Eigenschaft vergessen, aber es gibt das gleiche Ergebnis. –

Antwort

1

Das ist für mich arbeitet, wenn ich ausdrücklich Besitzer auf der Subwindow gesetzt:

<ComboBox 
    ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=Owner.DataContext.Property}"/> 

jedoch: Es gibt eine wichtige Einschränkung, die ich denke, könnte möglicherweise das Problem sein die Sie haben: Wenn der Subwindow ist ein privates Mitglied des Elternteils, und ich setze den Besitzer, kurz bevor das Unterfenster angezeigt wird, es versucht, die Bindung aufzulösen, bevor das Unterfenster angezeigt wird. Der Besitzer ist zu diesem Zeitpunkt null und es wird nicht erneut versucht, wenn der Besitzer später erneut eingestellt wird.

Wenn ich jedoch eine neue Instanz eines Unterfensters in der Methode, in der ich es zeige, einstelle, setze Besitzer und rufe dann ShowDialog() auf, wird die Bindung korrekt mit dem Nicht-Null-Wert für Besitzer aufgelöst. Ich bin einigermaßen zuversichtlich, der Grund dafür ist, dass der Eigentümer keine DependencyProperty ist und auch nicht PropertyChanged aufruft, so dass nichts passiert, was dazu führt, dass irgendwelche Updates als Reaktion auf den Wert der Owner Changing durchgeführt werden. Wenn ich es auf eine neue Instanz eines Fensters setze, während der UI-Thread auf einem Event-Handler blockiert, dann kommt die neue Fensterinstanz nicht dazu, etwas mit Bindings zu tun, lange nachdem der Owner gesetzt ist. Aber wenn ich es früher erstellt habe und dann den UI-Thread ausgeführt habe, ist es bereits zu spät.

Dies ist nicht etwas, mit dem Sie sich anlegen möchten.

Meine Empfehlung:

Geben Sie Ihrem Subwindow eine Eigenschaft wie folgt:

#region OwnerDataContext Property 
public Object OwnerDataContext 
{ 
    get { return (Object)GetValue(OwnerDataContextProperty); } 
    set { SetValue(OwnerDataContextProperty, value); } 
} 

public static readonly DependencyProperty OwnerDataContextProperty = 
    DependencyProperty.Register("OwnerDataContext", typeof(Object), typeof(SubWindow), 
     new PropertyMetadata(null)); 
#endregion OwnerDataContext Property 

Dann, wenn Sie die Unterfenster zeigen ...

var dialog = new Dialog(DialogViewModel) 
{ 
    Owner = Window.GetWindow(this), 
    OwnerDataContext = DataContext 
}; 

ein DependencyProperty sein, werden Bindungen in Wechselwirkung treten mit es richtig. Das Besitzerfenster kann es beliebig setzen und Sie können sich daran binden. Die Art und Weise, wie die Bindung funktioniert, ist ducktypisiert, so dass es für eine Bindung, die OwnerDataContext einen deklarierten Objekttyp hat, überhaupt keine Rolle spielt. Es ist sowieso alles eine Reflexion.

Ich mag mich total irren, warum dein Code nicht funktioniert, aber ich wette, das wird auf jeden Fall funktionieren.

+0

Es kann nicht im Zusammenhang stehen, aber die Methoden GetValue() und SetValue() sind in einer Bibliothek oder eine benutzerdefinierte Implementierung? Danke –

+0

@ J.Pichardo Sie sind von DependencyObject IIRC geerbt. Abhängigkeitseigenschaften sind ein wesentlicher Bestandteil von WPF. Gibt es dir Ärger? –