如何从背后的代码访问数据模板中的控件?
问题描述:
我在 DataTemplate
中有一个 MediaElement
,但我无法从后面的代码访问它.
I have a MediaElement
within the DataTemplate
but I am unable to access it from the code behind.
我在下面发布 XAML 代码:
I am posting 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>
</Grid>
背后的代码:
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 anyone of you please tell me how can it be done?
答
您应该能够使用 FrameworkTemplate.FindName
方法访问您的控件...首先,从 ListBoxItem
之一获取 ContentPresenter
:
You should be able to access your control using the FrameworkTemplate.FindName
method... first, get the ContentPresenter
from one of the ListBoxItem
s:
ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(yourListBoxItem);
然后从ContentPresenter
获取DataTemplate
:
DataTemplate yourDataTemplate = contentPresenter.ContentTemplate;
然后从DataTemplate
中获取MediaElement
:
MediaElement yourMediaElement = yourDataTemplate.FindName("vidList", contentPresenter)
as MediaElement;
if (yourMediaElement != null)
{
// Do something with yourMediaElement here
}
请参阅FrameworkTemplate.FindName
页面了解更多信息.
Please see the FrameworkTemplate.FindName
Method page on MSDN for more information.