WPF,在多个子控件上设置具有单个值的属性

时间:2010-04-25 21:21:50

标签: c# wpf silverlight

我有一个父内容控件,它通过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>

2 个答案:

答案 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)