2009-05-07 6 views
5

Ho un controllo WPF che espone uno dei suoi figli (dal suo ControlTemplate) attraverso una proprietà di sola lettura. Al momento è solo una proprietà CLR, ma non credo che faccia alcuna differenza.Posso usare XAML per impostare una proprietà nidificata (proprietà del valore di una proprietà) di un controllo?

Voglio essere in grado di impostare una delle proprietà sul controllo figlio da XAML dove sto istanziando il controllo principale. (In realtà, vorrei legare ad essa, ma penso che l'impostazione che sarebbe stato un buon primo passo.)

Ecco po 'di codice:

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

Ecco i due modi in cui posso pensare di impostare la nidificato proprietà in XAML (né compilare):

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

È possibile?

Senza di esso, suppongo che dovrò solo esporre i DP sul controllo principale che sono vincolati ai bambini (nel modello). Non così male, immagino, ma stavo solo cercando di evitare un'esplosione di proprietà sul controllo principale.

Cheers.

risposta

4

Non si può fare in questo modo ... è possibile accedere alle proprietà nidificate attraverso il suo percorso in un legame, ma non quando si definisce il valore della proprietà.

Devi fare una cosa del genere:

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

Sì, questo è quello che ho pensato. :-( Extra PS sul mio controllo di primo livello lo è, allora! – Swythan

+6

BTW. Non può farlo come nel tuo esempio XAML, come io non voglio sostituire il valore esistente della proprietà XAxis con un nuova istanza di Axis. – Swythan

+0

mi chiedo qual è la ragione per WPF non sostenere vincolante per le proprietà nidificate? Come altrimenti si finisce per duplicarli. – Vitalij