Чтобы использовать FindName в шаблоне данных, вам потребуется ссылка на ContentPresenter.См. Статью Джоша Смита Как использовать FindName с ContentControl .
На самом деле вы можете захотеть использовать ControlTemplate, а не DataTemplate.Это должно быть проще в использовании и позволит пользователям вашего элемента управления применять свои собственные шаблоны содержимого или использовать неявные шаблоны.Если вы сделаете что-то вроде этого:
<UserControl.Template>
<ControlTemplate TargetType="UserControl">
<Grid>
<ContentPresenter/>
<Ellipse Name="myEllipse" Stroke="White"/>
</Grid>
</ControlTemplate>
</UserControl.Template>
Тогда в коде (возможно, в переопределении OnApplyTemplate) вы сможете сделать это:
var ellipse = Template.FindName("myEllipse", this) as Ellipse;
Вы также должны украсить свой класс с помощьюАтрибут TemplatePartAttribute выглядит следующим образом:
[TemplatePart(Name="myEllipse", Type = typeof(Ellipse))]
Так что, если кто-то повторно шаблонирует ваш элемент управления, он знает, что должен предоставить элемент Ellipse с этим именем.(Это менее важно, если класс используется только для внутреннего использования.)
Наконец, если все, что вы хотите сделать, это изменить цвет эллипса, то вы можете просто использовать привязку данных.Вы можете создать свойство зависимости EllipseColor для вашего элемента управления и просто установить Stroke="{TemplateBinding EllipseColor}"
.