2009-05-07 21 views
5

Tengo un control WPF que expone uno de sus hijos (desde su ControlTemplate) a través de una propiedad de solo lectura. Por el momento, es solo una propiedad de CLR, pero no creo que eso haga la diferencia.¿Puedo usar XAML para establecer una propiedad anidada (propiedad del valor de una propiedad) de un control?

Quiero ser capaz de establecer una de las propiedades en el control secundario desde el XAML donde estoy instanciando el control principal. (En realidad, me gustaría unirse a ella, pero creo que poniendo sería un buen primer paso.)

Aquí hay algo de 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); } 
    } 
} 

He aquí las dos maneras que puedo pensar en establecer el anidado propiedad en XAML (ninguno de compilación):

<!-- 
    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 unen a los elementos secundarios (en la plantilla). No tan mal, supongo, pero solo estaba tratando de evitar una explosión de propiedades en el control principal.

Saludos.

Respuesta

4

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

que tiene que hacer algo así:

<local:ChartControl> 
    <local:ChartControl.XAxis> 
     <local:Axis Maximum="{Binding Maximum}"/> 
    </local:ChartControl.XAxis> 
</local:ChartControl> 
+0

Sí, eso es lo que pensaba. :-( DP adicionales en mi control de nivel superior es, entonces! – Swythan

+6

BTW. No puedo hacerlo como en su ejemplo XAML, ya que no quiero reemplazar el valor existente de la propiedad XAxis con un nueva instancia de Axis. – Swythan

+0

Me pregunto cuál es la razón por la que WPF no admite el enlace a las propiedades anidadas. De lo contrario, terminas duplicándolas. – Vitalij

Cuestiones relacionadas