2013-10-15 15 views
5

Xin chào, tôi có một số MediaElement trong số DataTemplate nhưng tôi không thể truy cập nó từ mã phía sau.cách truy cập một điều khiển trong Mẫu Dữ liệu từ mã phía sau?

tôi gửi mã XAML dưới đây:

<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> 

Mã đằng sau:

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;       
} 

ai trong các bạn có thể vui lòng cho tôi biết làm thế nào nó có thể được thực hiện?

+0

Có thể trùng lặp http://stackoverflow.com/questions/8126700/how-do-i-access-an-element-of-a-control-template-from-within-code-behind –

+0

Bản sao của [Truy cập được đặt tên là TextBox trong mã phía sau từ DataTemplate của ContentPresenter] (http://stackoverflow.com/questions/1415771/access-a-named-textbox-in-the-code-behind-from-a-contentpresenters-datatemplate) .. xin vui lòng xem câu hỏi này cho câu trả lời. Bạn cũng có thể tìm thấy một câu trả lời khác trong [Truy cập XAML kiểm soát trong DataTemplate từ CodeBehind?] (Http://stackoverflow.com/questions/13166726/access-xaml-control-in-datatemplate-from-codebehind) bài. – Sheridan

+0

Làm thế nào về việc sử dụng MVVM? để nhận và thiết lập Nguồn của MediaElement – JSJ

Trả lời

10

Bạn nên có thể truy cập kiểm soát của bạn bằng cách sử dụng phương pháp FrameworkTemplate.FindName ... đầu tiên, có được ContentPresenter từ một trong những ListBoxItem s:

ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(yourListBoxItem); 

Sau đó lấy DataTemplate từ ContentPresenter:

DataTemplate yourDataTemplate = contentPresenter.ContentTemplate; 

Sau đó lấy MediaElement từ DataTemplate:

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

Hãy xem FrameworkTemplate.FindName Method trang trên MSDN để biết thêm thông tin.

+0

+1 cho câu trả lời duy nhất có ý nghĩa cho câu hỏi này .. – Nitin

+0

Cảm ơn @nit ... thật không may, có vẻ như tôi đã được đưa ra một phiếu giảm giá đáng kể hoặc trả đũa xuống câu trả lời này ... đơn giản là không có lý do khác để bỏ phiếu nó .... một số người quá non nớt. – Sheridan

+0

bỏ qua chúng .. bạn đá !!! – Nitin

0

Bạn có gửi trong xử lý sự kiện của bạn, đó là ListBoxItem, và MediaElement là ListBoxItem.Content

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

-1 Tôi tin rằng bạn không chính xác. Bạn có thể sử dụng phương thức ['FrameworkTemplate.FindName'] (http://msdn.microsoft.com/en-us/library/system.windows.frameworktemplate.findname.aspx). – Sheridan

+0

Vâng, được rồi, tôi có nghĩa là bạn không thể làm điều đó bằng một tên biến như vidList.DoSomething(). Và để sử dụng giải pháp của bạn, bạn sẽ cần phải truy cập FrameworkTemplate bằng cách nào đó. Và tôi đã cung cấp một giải pháp làm việc đơn giản. –

+0

Tôi rất sẵn lòng xóa bỏ phiếu bầu này nếu bạn chỉnh sửa câu trả lời của mình bằng một cái gì đó ít không chính xác ... * Bạn không thể làm điều đó bằng tên * tuyên bố là không chính xác. – Sheridan

Các vấn đề liên quan