DataTemplate插入UserControl

时间:2011-12-17 17:06:48

标签: c# wpf datatemplate

我正为DataTemplate创建MyObject。例如,MyObject包含名为StackPanel的{​​{1}}。如何将public StackPanel MyStackPanel插入MyObject的DataTemplate?

2 个答案:

答案 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)

你不能做那样的事情,模板正在构建执行的计划,它们不包含特定的实例或对特定实例的引用。