XAMLを使用して、コントロールのネストされたプロパティ(プロパティの値のプロパティ)を設定できますか?
-
08-07-2019 - |
質問
読み取り専用プロパティを介して(ControlTemplateの)その子の1つを公開するWPFコントロールを持っています。現時点では単なるCLRプロパティですが、それが違いを生むとは思いません。
メインコントロールをインスタンス化するXAMLから子コントロールのプロパティの1つを設定できるようにしたい。 (実際、それにバインドしたいのですが、設定することは良い最初のステップになると思います。)
ここにいくつかのコードがあります:
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でネストされたプロパティを設定する2つの方法を考えます(どちらもコンパイルしません):
<!--
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を公開するだけでよいと思います。それほど悪くはないと思いますが、メインコントロールのプロパティの爆発を避けようとしていました。
乾杯。
解決
このようにすることはできません...バインディングのパスを使用してネストされたプロパティにアクセスできますが、プロパティの値を定義するときはできません。
あなたはそのようなことをしなければなりません:
<local:ChartControl>
<local:ChartControl.XAxis>
<local:Axis Maximum="{Binding Maximum}"/>
</local:ChartControl.XAxis>
</local:ChartControl>
所属していません StackOverflow