Как заполнить элементы управления коллекцией в пользовательском элементе управления WPF? - PullRequest
2 голосов
/ 15 мая 2011

Я изучаю все тонкости создания пользовательских элементов управления в WPF.Понятия, которые я понимаю до сих пор:

  1. Код определяет поведение элемента управления.
  2. Шаблон определяет внешний вид и восприятие элемента управления, визуальный аспект.
  3. Вы можетепривязать элементы шаблона к свойствам базового объекта управления.

Если шаблон имеет несколько элементов управления коллекциями, таких как StackPanels, как вы связываете их так, чтобы они заполнялись базовыми коллекциями?Моим первым желанием было использовать DataContext каждого StackPanel, но я не мог заставить его работать.У меня такое чувство, что мне не хватает ключевой концепции, которая могла бы решить эту проблему для меня.

Ответы [ 2 ]

7 голосов
/ 15 мая 2011

Кем вы хотели быть в этих StackPanels?Панели используются для расстановки предметов.Если вы хотите показать коллекцию элементов, вы, вероятно, захотите использовать ItemsControl (или один из множества типов ItemsControls).Элемент ItemsControl очень мощный - вы можете указать, как отображаются элементы, а также как отображается панель, на которой они отображаются.Вы даже можете указать, что панель является StackPanel.Например,

    <ItemsControl ItemsSource="{Binding ElementName=root, Path=List1}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <!-- Template defines the panel -->
                <StackPanel IsItemsHost="True" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <!-- Template defines each item -->
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

Затем вы хотите привязать список элементов, что очень просто с ItemsControl!В вашем случае с пользовательским элементом управления вы можете указать свойства зависимостей для самого элемента управления в выделенном фрагменте кода, а затем связать их со свойствами из XAML.Например, вы можете создать свойства зависимости для различных списков, которые у вас есть, например:

        public static readonly DependencyProperty List1Property = DependencyProperty.Register(
        "List1",
        typeof(IList<string>),
        typeof(MyControl));

    public static readonly DependencyProperty List2Property = DependencyProperty.Register(
        "List2",
        typeof(IList<string>),
        typeof(MyControl));

Затем вы можете связать свойство ItemsSource ваших ItemsControls:

    <ItemsControl ItemsPanel="..." ItemsSource="{Binding ElementName=root, Path=List1}" />
    <ItemsControl ItemsPanel="..." ItemsSource="{Binding ElementName=root, Path=List2}" />

(в данном случаеЯ предполагаю, что пользовательский элемент управления имеет топор: Name = "root")

Надеюсь, это поможет!

2 голосов
/ 15 мая 2011

Вы не можете привязать содержимое StackPanel напрямую. Это просто элемент управления макетом.

Однако вы можете использовать ListBox и установить для его ItemsPanel значение StackPanel (или любой другой элемент управления макетом, который вам нужен). Затем вы можете установить ListBox s ItemsSource на любую нужную базовую коллекцию.

...