我正为DataTemplate
创建MyObject
。例如,MyObject
包含名为StackPanel
的{{1}}。如何将public StackPanel MyStackPanel
插入MyObject的DataTemplate?
答案 0 :(得分:1)
这可以做到,但我不明白你为什么要这样做。
在这个例子中,我使用“Customer”作为对象类型,并在其中包含一个Button(但它可以很容易地成为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继承),但我还没有测试过。
带有模板的MainWindow:
<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;
};
}
}
答案 1 :(得分:0)
你不能做那样的事情,模板正在构建执行的计划,它们不包含特定的实例或对特定实例的引用。