2016-05-24 5 views
0

Ich habe zwei verschiedene DataTemplates in einer UserControl-Ressource. Ein DataTemplate enthält ein Bildsteuerelement und das andere DataTemplate ein Medienelementsteuerelement. Der DataType jedes DataTemplate repräsentiert ein ImageViewModel bzw. ein VideoViewModel. In meiner Benutzerkontrolle habe ich ein Raster, das ein ContentControl enthält. Die Inhaltseigenschaft des Inhaltssteuerelements ist an eine Eigenschaft gebunden, die das aktuelle Ansichtsmodell darstellt, das verwendet werden soll.Wie kann ich auf ein Steuerelement eines DataTemplate zugreifen?

Die Idee ist, den Inhalt des Gitters auf dem aktuellen Ansicht Modell groß Dies funktioniert

<UserControl.Resources> 
    <DataTemplate DataType="{x:Type vm:ImageScreensaverViewModel}"> 
     <Image Source="{Binding Image}" Stretch="Uniform"/> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type vm:VideoScreensaverViewModel}"> 
     <MediaElement x:Name="Player" Source="{Binding Video}" LoadedBehavior="Play" /> 
    </DataTemplate> 
</UserControl.Resources> 

<UserControl.CommandBindings> 
    <CommandBinding Command="MediaCommands.Pause" Executed="PausePlayer" CanExecute="CanExecute"/> 
    <CommandBinding Command="MediaCommands.Play" Executed="PlayPlayer" CanExecute="CanExecute"/> 
</UserControl.CommandBindings> 

<Grid> 
    <ContentControl x:Name="ScreanSaverContent" Content="{Binding CurrentVm}"/> 
</Grid> 

abhängig zu ändern, aber ich brauche hinter dem Media in Code zuzugreifen, so dass ich den Media-Player steuern kann (Play, Stop, Pause)

Ich habe bereits die Lösung auf hier ohne Erfolg versucht versucht. Ich kann nur auf das ausgewählte Ansichtsmodell über die Inhaltseigenschaft zugreifen.

Antwort

1

dieses Stück Code Versuchen Sie, eine Sonde in Content zu erreichen:

public static FrameworkElement GetControlByName(DependencyObject parent, string name) 
    { 
     int count = VisualTreeHelper.GetChildrenCount(parent); 
     for (var i = 0; i < count; ++i) 
     { 
      var child = VisualTreeHelper.GetChild(parent, i) as FrameworkElement; 
      if (child != null) 
      { 
       if (child.Name == name) 
       { 
        return child; 
       } 
       var descendantFromName = GetControlByName(child, name); 
       if (descendantFromName != null) 
       { 
        return descendantFromName; 
       } 
      } 
     } 
     return null; 
    } 
+0

Vielen Dank! Das hat funktioniert :) – RDaniel

+0

Wenn die Lösung für Sie @ RDaniel funktioniert, dann markieren Sie seine Antwort als die akzeptable Antwort – MethodMan