我有一个父内容控件,它通过datatemplate显示数据。 datatemplate包含一个stackpanel,其中包含几个相同类型的usercontols。我喜欢在父控件上只设置一次属性,它必须在所有子控件上设置属性的值。但如果有一种方法可以在stackpanel上进行,那也没关系。模板可以在运行时更改,值也需要传播到新模板。
我目前的解决方案是在父控件和子控件上实现该属性,并使用代码将值从父传播到所有子控件。我的问题是:有更好的或其他方法吗?
编辑: 一些澄清我的问题的说明。该应用程序目前是WPF,但如果它可以移植到silverlight,那将是一个奖励。该属性是Style类型的依赖项。
我想用它来设计部分子控件的样式。目前,datatemplate存储在单独的资源字典中,因此可以重复使用。子控件的视觉效果通过controltemplate设计。该模板包含三个不同的控件,第一个是标签。需求(欲望,愚蠢的愿望)是仅将样式设置一次,以使datatemplate中的所有子控件上的标签具有一致的外观和感觉。 因此,问题的关键是覆盖子控件上的样式依赖项属性的值,该子控件存储在容器控件的资源字典中。两者都是自定义用户控件,因此所有选项都是打开的。
<Parent SubSubStyle="x" Template="template" />
<DataTemplate x:Key=template>
<StackPanel>
<Subcontrol SubSubStyle="?"/>
<Subcontrol SubSubStyle="?"/>
<Subcontrol SubSubStyle="?"/>
<Subcontrol SubSubStyle="?"/>
</StackPanel>
</DataTemplate>
答案 0 :(得分:1)
您尝试设置已创建的DependencyProperty的属性是?如果是这样,在WPF中做的理想事情是定义属性,使其在可视化树中的元素为inherited。
如果它不是您自己的依赖属性(或者如果您使用的Silverlight不支持此机制),那么您应该使用implicit styles。
public class MyControl {
// be prepared for some dependency property hell below
// this defines a DependencyProperty whose value will be inherited
// by child elements in the visual tree that do not override
// the value. An example of such a property is the FontFamily
// property. You can set it on a parent element and it will be
// inherited by child elements that do not override it.
public static readonly DependencyProperty MyInheritedProperty =
DependencyProperty.Register(
"MyInherited",
typeof(string),
typeof(MyControl),
new FrameworkPropertyMetadata(
null,
FrameworkPropertyMetadataOptions.Inherits
)
);
}
答案 1 :(得分:0)