2009-05-07 7 views
5

J'ai un contrôle WPF qui expose l'un de ses enfants (à partir de ControlTemplate) via une propriété en lecture seule. En ce moment, c'est juste une propriété CLR, mais je ne pense pas que cela fasse une différence.Puis-je utiliser XAML pour définir une propriété imbriquée (propriété de la valeur d'une propriété) d'un contrôle?

Je souhaite être en mesure de définir l'une des propriétés du contrôle enfant à partir du code XAML dans lequel j'instancie le contrôle principal. (En fait, je voudrais lier à lui, mais je pense que couchait ce serait une bonne première étape.)

Voici quelques code:

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

Voilà deux façons que je peux penser à mettre la imbriquée propriété en XAML (aucune compilation):

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

Est-ce encore possible? Sans cela, je suppose que je vais juste besoin d'exposer DP sur le contrôle principal qui est lié aux enfants (dans le modèle). Pas si mal, je suppose, mais j'essayais juste d'éviter une explosion de propriétés sur le contrôle principal.

Cheers.

Répondre

4

Vous ne pouvez pas le faire de cette manière ... vous pouvez accéder aux propriétés imbriquées via son chemin dans une liaison, mais pas lorsque vous définissez la valeur de la propriété.

Vous devez faire quelque chose comme ça:

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

Ouais, c'est ce que je pensais. :-( Je ne peux pas le faire comme dans votre exemple XAML, car je ne veux pas remplacer la valeur existante de la propriété XAxis par une valeur de – Swythan

+6

. nouvelle instance d'Axis – Swythan

+0

Je me demande quelle est la raison pour laquelle WPF ne supporte pas la liaison aux propriétés imbriquées, sinon vous finissez par les dupliquer. – Vitalij

Questions connexes