Это можно сделать, но я не понимаю, почему вы хотите.
В этом примере я использую «Customer» в качестве типа объекта и в нем содержится кнопка (но это может быть и StackPanel).
public class Customer : DependencyObject
{
public Customer()
{
MyButton = new Button();
MyButton.Content = "I'm a button!";
}
#region MyButton
public Button MyButton
{
get { return (Button)GetValue(MyButtonProperty); }
set { SetValue(MyButtonProperty, value); }
}
public static readonly DependencyProperty MyButtonProperty =
DependencyProperty.Register("MyButton", typeof(Button), typeof(Customer));
#endregion
}
Я не уверен, что вы могли бы сделать это, не делая ваш объект DependencyObject и не определяя вложенный элемент управления как свойство зависимости. Реализация INotifyPropertyChanged может работать как альтернатива (если ваш объект не может наследоваться от DependencyObject), но я этого не проверял.
Главное окно с шаблоном:
<Window x:Class="TemplateTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TemplateTest"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type local:Customer}">
<ContentPresenter Content="{Binding MyButton}" />
</DataTemplate>
</Window.Resources>
<Grid>
<ItemsControl x:Name="CustomersList" />
</Grid>
</Window>
Как видите, я использую ContentPresenter для привязки кнопки, исходящей от объекта.
Затем вы можете проверить это с помощью:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Loaded += (s, e) =>
{
var myCustomer1 = new Customer();
var myCustomer2 = new Customer();
var customers = new ObservableCollection<Customer>();
customers.Add(myCustomer1);
customers.Add(myCustomer2);
CustomersList.ItemsSource = customers;
};
}
}