Как получить доступ к именованному элементу производного пользовательского элемента управления в silverlight? - PullRequest
1 голос
/ 12 апреля 2010

У меня есть пользовательский базовый элемент управления в silverlight.

<UserControl x:Class="Problemo.MyBaseControl"
    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"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <Border Name="HeaderControl" Background="Red" />
    </Grid>
</UserControl>

со следующим кодом

public partial class MyBaseControl : UserControl
    {
        public UIElement Header { get; set; }

        public MyBaseControl()
        {
            InitializeComponent();
            Loaded += MyBaseControl_Loaded;
        }

        void MyBaseControl_Loaded(object sender, RoutedEventArgs e)
        {
            HeaderControl.Child = Header;
        }
    }

У меня есть производный контроль.

<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="header" Text="{Binding Text}" />
    </me:MyBaseControl.Header> 
</me:MyBaseControl>

со следующим кодом.

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

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

Я пытаюсь установить текстовое значение текстового блока заголовка в производном элементе управления.

Было бы неплохо иметь возможность установить оба способа, т. Е. С привязкой данных или в производном управляющем коде, но ни одна из них не работает. С привязкой данных это не работает. Если я попробую код, я получу пустую ссылку на заголовок. Это Silverlight 4 (не уверен, если это имеет значение)

Любые предложения о том, как сделать с привязкой данных и в коде?

Приветствия

1 Ответ

0 голосов
/ 12 апреля 2010

Прежде всего я покажу вам, как настроить ваш элемент управления Derived, чтобы справиться с этим.Вам нужно сделать две вещи, во-первых, вам нужно реализовать INotifyPropertyChanged, а во-вторых, добавить привязку в пользовательский элемент управления.

MyControl Xaml: -

<me:MyBaseControl.Header>     
    <TextBlock Name="headerItem" />     
</me:MyBaseControl.Header>

Код MyControl:

public partial class MyControl : MyBaseControl, INotifyPropertyChanged
{
    public MyControl ()
    {
        InitializeComponent();
        headerItem.SetBinding(TextBlock.TextProperty, new Binding("Text") { Source = this });
    }

    string _text;
    public string Text
    {
        get { return _text; }
        set { _text = value; NotifyPropertyChanged("Text"); }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    void NotifyPropertyChanged(string name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }

    #endregion
}

Это должно заставить вас работать. Однако , как только вы почувствуете, что вам нужно унаследовать класс на основе UserControl, вы должны сделать шаг назад и спросить, должны ли базовые и производные элементы быть шаблонными элементами управления.Если у меня будет время, я попытаюсь добавить версию вашего кода с точки зрения шаблонных элементов управления.

...