Per XAML auf Parent oder Child zugreifen?

  • WPF
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Per XAML auf Parent oder Child zugreifen?

    Guten Morgen :)

    Ich habe ein bestehendes Window, das im XAML so aussieht:

    XML-Quellcode

    1. ​<Window x:Class="DialogFenster"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:Skalierung="clr-namespace:VamosALaPlayer_3._0.ViewModel.SkalierenVerhindern;assembly=VamosALaPlayer_3._0.ViewModel"
    7. xmlns:local="clr-namespace:VamosALaPlayer_3._0.View"
    8. mc:Ignorable="d"
    9. Background="Black" BorderBrush="{DynamicResource VordergrundfarbeBrush}" BorderThickness="1">
    10. <Skalierung:DpiDecorator>
    11. <Grid>
    12. <Grid.RowDefinitions>
    13. <RowDefinition Height="28"/>
    14. <RowDefinition Height="*"/>
    15. </Grid.RowDefinitions>
    16. <Label FontWeight="Bold" FontSize="13" Foreground="Black" Background="{DynamicResource VordergrundfarbeBrush}" Grid.Row="0" MouseLeftButtonDown="Label_MouseLeftButtonDown"/>
    17. <ContentPresenter Content="{Binding}" Grid.Row="1"/>
    18. </Grid>
    19. </Skalierung:DpiDecorator>
    20. </Window>


    Nun wird in diesem Window dynamisch jeweils ein UserControl angezeigt durch den ContentPresenter. Dazu habe ich in der Application.xaml z.B. das hier:

    XML-Quellcode

    1. <DataTemplate DataType="{x:Type viewmodel:OrdnerBrowserViewModel}">
    2. <View:OrdnerBrowserView/>
    3. </DataTemplate>


    Das Viewmodel wird also per Binding an den ContentPresenter übergeben und die entsprechende View (ein UserControl) zugeordnet.

    Nun möchte ich eine Farbanimation durch Code Behind zufügen, allerdings nur, wenn ein bestimmtes ViewModel geladen wird. Animiert werden sollen BorderBrush des Windows und Background des Labels.

    Dabei habe ich in der entsprechenden View, die dann in dem Fenster angezeigt wird, mehrere Elemente. Von einem davon wird die Farbe per Code Behind geändert, die Farben der anderen Controls sind durch ElementBinding daran gebunden.

    Wie kann ich also BorderBrush des Windows und Background des Labels per ElementBinding an die Farbe des einen Controls binden, dessen Farbe animiert wird? Das UserControl ist ja sozusagen ein Child (?) des Windows...

    Oder sollte ich den Code mit der Farbanimierung anstattdessen in den Code Behind des Windows packen und genau andersrum verfahren, die Farben der Controls in meinem UserControl an die Farbe des Labels im Window binden?

    Oder fällt euch vielleicht eine andere Rangehensweise noch ein, die ich nicht bedacht hab?

    Zur Entwicklungszeit weisss das Window ja dabei nicht , welches UserControl in ihm angezeigt wird.

    Hab das gestern mal zwei Stunden gegoogelt und konnte einfach nichts passendes für diesen bestimmten Fall gefunden.

    Wenn ihr mehr Code braucht, einfach bitte kurz melden :)
    vielleicht kannste im OnVisualParentChanged des OrdnerBrowserViews feststellen, was das Parent-Window ist, und darin herumkramen.
    Natürlich höchst unschön.
    Und mit Events, Interfaces, Delegaten und Kram kann man das wohl auch noch iwie entkoppeln. Blos ist der Entkoppelei-Aufriss noch viel unschöner, und da es eh nirgends anders gebraucht wird, auch von fragwürdiger Sinnhaftigkeit.