我有一个WPF控件,通过只读属性公开其中一个子节点(来自它的ControlTemplate)。目前它只是一个CLR属性,但我认为这没有任何区别。
我希望能够从我正在实例化主控件的XAML中设置子控件的一个属性。 (实际上,我想绑定它,但我认为设置它将是一个很好的第一步。)
以下是一些代码:
public class ChartControl : Control
{
public IAxis XAxis { get; private set; }
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
this.XAxis = GetTemplateChild("PART_XAxis") as IAxis;
}
}
public interface IAxis
{
// This is the property I want to set
double Maximum { get; set; }
}
public class Axis : FrameworkElement, IAxis
{
public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(double), typeof(Axis), new FrameworkPropertyMetadata(20.0, FrameworkPropertyMetadataOptions.AffectsRender, OnAxisPropertyChanged));
public double Maximum
{
get { return (double)GetValue(MaximumProperty); }
set { SetValue(MaximumProperty, value); }
}
}
以下是我可以考虑在XAML中设置嵌套属性的两种方法(既不编译):
<!--
This doesn't work:
"The property 'XAxis.Maximum' does not exist in XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'."
"The attachable property 'Maximum' was not found in type 'XAxis'."
-->
<local:ChartControl XAxis.Maximum="{Binding Maximum}"/>
<!--
This doesn't work:
"Cannot set properties on property elements."
-->
<local:ChartControl>
<local:ChartControl.XAxis Maximum="{Binding Maximum}"/>
</local:ChartControl>
这甚至可能吗?
如果没有它,我想我只需要在主要控件上公开DP,这些控件将绑定到子项(在模板中)。我猜,并不是那么糟糕,但我只是想避免主控制器上的属性爆炸。
干杯。
答案 0 :(得分:4)
您不能这样做...您可以通过绑定中的路径访问嵌套属性,但不能在定义属性值时访问。
你必须做那样的事情:
<local:ChartControl>
<local:ChartControl.XAxis>
<local:Axis Maximum="{Binding Maximum}"/>
</local:ChartControl.XAxis>
</local:ChartControl>