DataTemplate со вставкой UserControl - PullRequest
0 голосов
/ 17 декабря 2011

Я создаю DataTemplate для MyObject. MyObject содержит, например, StackPanel с именем public StackPanel MyStackPanel. Как я могу вставить MyStackPanel в DataTemplate MyObject?

Ответы [ 2 ]

1 голос
/ 17 декабря 2011

Это можно сделать, но я не понимаю, почему вы хотите.

В этом примере я использую «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;
            };
    }
}
0 голосов
/ 17 декабря 2011

Вы не можете делать что-то подобное, шаблоны строят планы, которые выполняются, они не содержат конкретных экземпляров или ссылок на конкретные экземпляры.

...