¿Puedo usar XAML para establecer una propiedad anidada (propiedad del valor de una propiedad) de un control?

StackOverflow https://stackoverflow.com/questions/834391

Pregunta

Tengo un control WPF que expone a uno de sus hijos (de su ControlTemplate) a través de una propiedad de solo lectura. Por el momento es solo una propiedad CLR, pero no creo que eso haga ninguna diferencia.

Quiero poder establecer una de las propiedades en el control secundario desde el XAML donde estoy instanciando el control principal. (En realidad, me gustaría unirme a él, pero creo que establecerlo sería un buen primer paso).

Aquí hay un código:

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); }
    }
}

Estas son las dos formas en que puedo pensar en establecer la propiedad anidada en XAML (ni compilar):

<!-- 
    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>

¿Es esto posible?

Sin él, supongo que solo tendré que exponer los DP en el control principal que se vinculan a los hijos (en la plantilla). No está mal, supongo, pero solo estaba tratando de evitar una explosión de propiedades en el control principal.

Saludos.

¿Fue útil?

Solución

No puede hacerlo así ... puede acceder a las propiedades anidadas a través de su ruta en un enlace, pero no cuando define el valor de la propiedad.

Tienes que hacer algo así:

<local:ChartControl>
    <local:ChartControl.XAxis>
        <local:Axis Maximum="{Binding Maximum}"/>
    </local:ChartControl.XAxis>
</local:ChartControl>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top