簡體   English   中英

如何訪問DataTemplate的控件

[英]How do I access a control of a DataTemplate

我在UserControl資源中有兩個不同的DataTemplates。 一個DataTemplate包含一個圖像控件,另一個DataTemplate包含一個媒體元素控件。 每個DataTemplate的DataType分別代表一個ImageViewModel和一個VideoViewModel。 在我的用戶控件中,有一個包含ContentControl的網格。 內容控件的content屬性綁定到一個屬性,該屬性表示應使用的當前視圖模型。

想法是根據當前視圖模型更改網格的內容

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

這很好用,但是我需要在后面的代碼中訪問MediaElement,以便可以控制媒體播放器(播放,停止,暫停)

我已經嘗試過將解決方案發布在hier上,但沒有成功。 我只能通過content屬性訪問選定的視圖模型。

嘗試這段代碼到達ContentPresenter內部的控件:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM