我有一个UserControl MyParentControl
,其中有另一个控件(TreeView)。我将此控件公开为dep属性,如TreeView MyChildControl
。
然后在使用MyParentConrol的XAML中,我想访问所有TreeView属性,例如Style。
我想写一些类似的东西:
<my:MyParentControl>
<my:MyParentControl.MyChildControl.Style>
<Style />
</my:MyParentControl.MyChildControl.Style>
</my:MyParentControl>
有没有办法实现这个目标?
答案 0 :(得分:2)
通过为内部控件公开DependencyProperty,您已经解决了一半的问题 - 即您可以在xaml中设置单个属性。
下一步是让这些属性设置器影响子控件。
实现这一目标有两种选择。
在控件模板中,定义子控件并在要设置的每个属性上使用Bindings。
在父控件模板中定义容器元素,并在依赖项属性更改时将其内容设置为您的子项。
尽管这两种方法都可行,但您可能会发现涉及最少代码和最大灵活性的解决方案是为您的子控件公开Style属性并将其应用于控件模板中。 / p>
public class ParentControl : Control
{
public Style ChildControlStyle
{
get { return (Style)GetValue(ChildControlStyleProperty); }
set { SetValue(ChildControlStyleProperty, value); }
}
public static readonly DependencyProperty ChildControlStyleProperty =
DependencyProperty.Register("ChildControlStyle",
typeof(Style),
typeof(ParentControl),
new PropertyMetadata(null));
}
<Style TargetType="ParentControl">
<Setter Property="ChildControlStyle">
<Setter.Value>
<Style TargetType="ChildControl">
<!-- setters -->
</Style>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ParentControl">
<Grid>
<ChildControl Style="{TemplateBinding ChildControlStyle}" />
<!-- other stuff -->
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
答案 1 :(得分:1)
你可以通过这样编写XAML来获得这种效果:
<my:MyParentControl>
<my:MyParentControl.Resources>
<Style TargetType="my:MyChildControl">
<Setter Property="Background" Value="Red"/>
</Style>
</my:MyParentControl.Resources>
<my:MyParentControl>
在此示例中,此XAML创建一个MyParentControl,其中MyChildControl类型的所有子项都具有红色背景。