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.
Ich würde erwarten, 'Owner.DataContext.Property' zu funktionieren, wie in Ihrem zweiten Beispiel, aber hinzufügen' .Property'. –
Es war ein Tippfehler, danke. –
Sorry ich habe die Eigenschaft vergessen, aber es gibt das gleiche Ergebnis. –