Posso usare XAML per impostare una proprietà nidificata (proprietà del valore di una proprietà) di un controllo?

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

Domanda

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.

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

Ecco un 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 proprietà nidificata 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>

È anche possibile?

Senza di essa, suppongo che dovrò solo esporre DP sul controllo principale che viene legato ai bambini (nel modello). Non male, immagino, ma stavo solo cercando di evitare un'esplosione di proprietà sul controllo principale.

Saluti.

È stato utile?

Soluzione

Non puoi farlo in questo modo ... puoi accedere alle proprietà nidificate tramite il suo percorso in un'associazione, ma non quando definisci il valore della proprietà.

Devi fare qualcosa del genere:

<local:ChartControl>
    <local:ChartControl.XAxis>
        <local:Axis Maximum="{Binding Maximum}"/>
    </local:ChartControl.XAxis>
</local:ChartControl>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top