在UserControl中公开子控件以在XAML中使用

时间:2009-01-29 17:39:51

标签: wpf xaml

我有一个包含TreeView的UserControl。我希望用户能够通过XAML设置内部TreeView控件的属性,我不知道该怎么做。

我尝试在UserControl上创建一个公共属性到TreeView,但这只允许我设置一个SelectedItemChanged触发器。

我想做点什么:

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

或者:

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

我不希望在UserControl中为每个TreeView属性创建属性,我不想强​​迫用户在C#中定义控件。

1 个答案:

答案 0 :(得分:0)

对于在用户控件中将多个属性传递给子控件,您始终可以公开Style属性。

即ChildStyle

对于ItemsSource,除非你使用[Josh Smith的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}" />