C# WPF,在多个子角色上使用单个值设置属性
我有一个父contentcontrol,它通过datatemplate显示数据。datatemplate包含一个stackpanel,其中包含多个相同类型的UserControl。我只想在父控件上设置一次属性,它必须在所有子控件上设置属性的值。但如果有一种方法可以在stackpanel上实现,也可以。可以在运行时更改模板,并且还需要将值传播到新模板 我当前的解决方案是在父控件和子控件上实现属性,并使用代码将值从父控件传播到所有子控件。我的问题是:有没有更好的或其他的方法 编辑: 对我的问题的一些澄清说明。该应用程序目前是WPF,但如果它可以移植到silverlight,这将是一个额外的好处。该属性是类型样式的依赖项 我想用它来设计部分子控件的样式。目前,datatemplate存储在单独的资源字典中,因此可以重用。子控制项的视觉效果通过controltemplate设置样式。该模板包含三个不同的控件,第一个是标签。需要(愿望,愚蠢的愿望)是只设置一次样式,以使datatemplate中所有子控件上的标签具有一致的外观和感觉。 所以问题的关键是重写子控件上的样式依赖属性的值,该属性存储在容器控件的资源字典中。两者都是自定义用户控件,因此所有选项都是打开的C# WPF,在多个子角色上使用单个值设置属性,c#,wpf,silverlight,C#,Wpf,Silverlight,我有一个父contentcontrol,它通过datatemplate显示数据。datatemplate包含一个stackpanel,其中包含多个相同类型的UserControl。我只想在父控件上设置一次属性,它必须在所有子控件上设置属性的值。但如果有一种方法可以在stackpanel上实现,也可以。可以在运行时更改模板,并且还需要将值传播到新模板 我当前的解决方案是在父控件和子控件上实现属性,并使用代码将值从父控件传播到所有子控件。我的问题是:有没有更好的或其他的方法 编辑: 对我的问题的一些
<Parent SubSubStyle="x" Template="template" />
<DataTemplate x:Key=template>
<StackPanel>
<Subcontrol SubSubStyle="?"/>
<Subcontrol SubSubStyle="?"/>
<Subcontrol SubSubStyle="?"/>
<Subcontrol SubSubStyle="?"/>
</StackPanel>
</DataTemplate>
样式是最好的选择是您试图设置已创建的DependencyProperty的属性吗?如果是这样的话,在WPF中理想的做法是定义属性,这样它将由可视化树中的元素来定义 如果它不是您自己的依赖项属性(或者如果您使用的Silverlight不支持此机制),那么您应该改为使用
您需要一个WPF和Silverlight解决方案,或者只需要Silverlight?它目前只是WPF,但如果它同时在WPF和Silverlight中工作,那就太好了。它可以工作,但我需要使用RegisterAttached(),而不是register来让继承正常工作。子控件需要AddOwner()及其选项。谢谢大家的回答!嗯,也许我还记得以前遇到过。我记得我在一个不相关的类上创建了一个附加属性,然后在父控件和子控件上执行AddOwner。这样,我在使用它时就不必使用附加属性语法。
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
)
);
}