Как получить доступ к именованному элементу в элементе управления, который наследуется от шаблонного элемента управления - PullRequest
3 голосов
/ 13 апреля 2010

Здравствуйте, это похоже на Как получить доступ к именованному элементу производного пользовательского элемента управления в silverlight? с той разницей, что она наследуется от шаблонного элемента управления, а не от пользовательского элемента управления.

У меня есть шаблонный элемент управления MyBaseControl

Xaml: -

<Style TargetType="Problemo:MyBaseControl">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Problemo:MyBaseControl">
                    <Grid x:Name="LayoutRoot" Background="White">
                        <Border Name="HeaderControl" Background="Red" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Код: -

 public class MyBaseControl : Control
    {
        public UIElement Header { get; set; }

        public MyBaseControl()
        {   
            DefaultStyleKey = typeof(MyBaseControl);
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            var headerControl = GetTemplateChild("HeaderControl") as Border;

            if (headerControl != null)
                headerControl.Child = Header;

        }
    }

У меня есть другой элемент управления, называемый myControl, который наследуется от элемента управления MyBaseControl

Xaml: -

<me:MyBaseControl x:Class="Problemo.MyControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:me="clr-namespace:Problemo" 
    d:DesignHeight="300" d:DesignWidth="400">
    <me:MyBaseControl.Header>
        <TextBlock Name="xxx" />
    </me:MyBaseControl.Header> 
</me:MyBaseControl>

Код: -

public partial class MyControl : MyBaseControl
{
    public string Text { get; set; }

    public MyControl(string text)
    {
        InitializeComponent();
        Text = text;
        Loaded += MyControl_Loaded;
    }

    void MyControl_Loaded(object sender, RoutedEventArgs e)
    {
        base.ApplyTemplate();
        xxx.Text = Text;
    }
}

Проблема в том, что ххх пуст. Как получить доступ к элементу управления xxx в коде позади?

1 Ответ

0 голосов
/ 09 марта 2011

Когда вы получаете доступ к HeaderControl, он извлекается из ControlTemplate. Элементы в шаблоне ControlTemplate создаются и добавляются как визуальные потомки элемента управления. Затем вызывается метод OnApplyTemplate, и вы можете получить к ним доступ через их имя.

Во втором случае вы специально назначаете отдельный элемент свойству Header. В этом случае невозможно получить «именованный» элемент, так как заголовок устанавливается явно.

Вы можете напрямую привести свойство Header, если знаете, что это будет TextBlock, например:

TextBlock tb = this.Header as TextBlock;
if (tb != null)
    tb.Text = Text;

В противном случае вы можете привязать TextBlock к свойству Text в вашем XAML, например:

<me:MyBaseControl.Header>
<TextBlock Name="xxx" Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type me:MyControl}}, Path=Text}" />
</me:MyBaseControl.Header>

Последний способ привязки является лучшим способом, поскольку вы не привязаны к данному элементу управления (т. Е. TextBlock).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...