Как сделать Silverlight UserControl контейнером содержимого? - PullRequest
3 голосов
/ 07 августа 2009

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

Вот мои вопросы относительно этого:

  1. Я получил атрибут для работы в качестве простого свойства зависимости, но чтобы связать его с пользовательским интерфейсом в самом элементе управления, мне пришлось установить DataContext элемента управления для его собственного класса (this.DataContext = this) , Это было грязно повсюду ... есть ли лучший способ сделать это?

  2. Я могу заставить потребителя моего пользовательского элемента управления скомпилировать с дочерним элементом Content, но я не знаю, как отобразить это в самом элементе управления. Я думал, что ContentPresenter, чье содержимое связано с контентом в текущем контексте привязки, но это не работает.

Я бы хотел, чтобы это сработало, но меня также интересует, что такое рекомендуемая / лучшая практика и почему. Мне было трудно гуглить эти вещи.

1 Ответ

4 голосов
/ 07 августа 2009

Примечание: у меня нет опыта работы с Silverlight, но в WPF я бы сделал следующее

Допустим, у вас есть элемент управления MyControl, производный от UserControl, со свойством MyProperty. Я думаю, что лучше всего определить ControlTemplate для вашего элемента управления:

<UserControl.Template>
    <ControlTemplate TargetType="{x:Type SomeNamespace:MyControl}">
        <StackPanel>
            <TextBlock Text="{TemplateBinding MyProperty}"/>
            <ContentPresenter/>
        </StackPanel>
    </ControlTemplate>
</UserControl.Template>

С {TemplateBinding} вы можете быстро создавать (OneWay!) Привязки к свойствам вашего элемента управления, в то же время вы можете использовать обычный синтаксис {Binding} для привязки к вашему фактическому DataContext. Размещение ContentPresenter в ControlTemplate автоматически отобразит все, что находится в вашем свойстве контента.

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