How to access a control in a data template from code?

Hi I have a MediaElement in a DataTemplate , but I cannot access it from the code.

I am sending the xaml code below:

 <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="605*"/> <ColumnDefinition Width="151*"/> </Grid.ColumnDefinitions> <GroupBox Header="My Videos" Height="177" VerticalAlignment="Top" Margin="5,320,5,0" Grid.ColumnSpan="2"> <ListBox x:Name="VideoList" ItemsSource="{Binding Videos }" Width="auto" Height=" auto" Margin="0,0,0,0" Grid.ColumnSpan="2" > <DataTemplate x:Name="DTVideos"> <ListBoxItem Name="lbivid1" BorderThickness="2" Width="240" Selected="lbivid_Selected" > <MediaElement Name="vidList" Height="150" Width="150" Source="{Binding SourceUri}" Position="00:00:05" LoadedBehavior="Pause" ScrubbingEnabled="True"/> </ListBoxItem> </DataTemplate> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" Margin="0,0,0,0"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ListBox> </GroupBox> <GroupBox Header="Preview" Height="320" Width="400" VerticalAlignment="Top" DockPanel.Dock="Left"> <MediaElement x:Name="videoPreview" HorizontalAlignment="Left" Height="300" VerticalAlignment="Top" Width="388"/> </GroupBox> 

Code behind:

  private void lbivid_Selected(object sender, RoutedEventArgs e) { imagePreview.Visibility = Visibility.Hidden; string urlStr = (VidList.Source).ToString(); Uri temp = new Uri(UrlStr); videoPreview.Source = temp; } 

Can any of you tell me how to do this?

+5
source share
2 answers

You must have access to your control using the FrameworkTemplate.FindName method ... first get the ContentPresenter from one of ListBoxItem s:

 ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(yourListBoxItem); 

Then get the DataTemplate from ContentPresenter :

 DataTemplate yourDataTemplate = contentPresenter.ContentTemplate; 

Then get the MediaElement from the DataTemplate :

 MediaElement yourMediaElement = yourDataTemplate.FindName("vidList", contentPresenter) as MediaElement; if (yourMediaElement != null) { // Do something with yourMediaElement here } 

For more information, see the FrameworkTemplate.FindName Method page on MSDN.

+10
source

You have the sender in the event handler, which is ListBoxItem, and MediaElement is ListBoxItem.Content

 var mediaElement = ((ListBoxItem)sender).Content as MediaElement; if (mediaElement != null) ... 
0
source

Source: https://habr.com/ru/post/988980/


All Articles