Предоставление вложенного элемента управления в UserControl для использования в XAML

У меня есть UserControl, который содержит TreeView. Я хочу, чтобы пользователь мог устанавливать свойства внутреннего элемента управления TreeView через XAML, и я не уверен, как это сделать.

Я попытался создать общедоступное свойство UserControl для TreeView, но это позволяет мне только установить триггер SelectedItemChanged.

Я хотел бы сделать что-то вроде:

<ExampleUserControl>
    <ExampleUserControl.TreeView.ItemTemplate>
        ...
    </ExampleUserControl.TreeView.ItemTemplate>
</ExampleUserControl>

Or:

<ExampleUserControl TreeView.ItemsSource="{Binding Foo}" />

Я бы предпочел не создавать свойства в UserControl для каждого свойства TreeView, и я не хочу заставлять пользователя определять элемент управления на C#.


person Dylan    schedule 29.01.2009    source источник
comment
Вы не можете складывать свойства в теги xaml (‹x.y.z.a.b.c›). И вы, вероятно, не можете выставить древовидную структуру как общедоступную собственность; в любом случае это было бы плохо, джу-джу. Скорее всего, вам нужно создать dp в пользовательском контроле и использовать привязку шаблона.   -  person    schedule 29.01.2009


Ответы (1)


Что касается передачи нескольких свойств дочернему элементу управления в пользовательском элементе управления, вы всегда можете открыть свойство Style.

т.е. дочерний стиль

Для ItemsSource, если вы не используете трюк [Josh Smith's Element Spy / Data Context Spy / Freezable][1], у вас будет отключение от DataContexts.

Так что либо вы используете эти приемы, либо просто имеете 2 свойства.

1) ItemsSource 2) ChildStyle

Xaml заканчивается...

    <ChildTreeAnswer:MyControl ItemsSource="{Binding Items}">
        <ChildTreeAnswer:MyControl.ChildStyle>
            <Style>
                <Setter Property="ItemsControl.ItemTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Border BorderBrush="Black"
                                    BorderThickness="1"
                                    Margin="5">
                                <TextBlock Text="{Binding }" />
                            </Border>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ChildTreeAnswer:MyControl.ChildStyle>                           
    </ChildTreeAnswer:MyControl>

Затем в вашем пользовательском элементе управления выполните... (для простоты я использовал список)

    <ListBox ItemsSource="{Binding ItemsSource}"
             Style="{Binding ChildStyle}" />
person JB.    schedule 30.01.2009