2009-05-07 4 views
5

Ich habe ein WPF-Steuerelement, das eines seiner untergeordneten Elemente (von ControlTemplate) über eine schreibgeschützte Eigenschaft verfügbar macht. Im Moment ist es nur eine CLR-Eigenschaft, aber ich denke nicht, dass das einen Unterschied macht.Kann ich XAML verwenden, um eine verschachtelte Eigenschaft (Eigenschaft des Werts einer Eigenschaft) eines Steuerelements festzulegen?

Ich möchte in der Lage sein, eine der Eigenschaften für das untergeordnete Steuerelement aus dem XAML festlegen, wo ich das Hauptsteuerelement instanziieren. (Eigentlich würde Ich mag es binden, aber ich denke, Einstellung, es wäre ein guter erster Schritt.)

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

hier die beiden Möglichkeiten, wie ich die verschachtelten die Einstellung denken kann Eigenschaft in XAML (keine Kompilierung):

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

Ist das überhaupt möglich?

Ohne es, ich denke, ich muss nur DPs auf der Hauptsteuerung, die durch die Kinder (in der Vorlage) gebunden werden. Nicht so schlimm, denke ich, aber ich wollte nur eine Explosion von Eigenschaften auf der Hauptkontrolle vermeiden.

Prost.

Antwort

4

Sie können es nicht so machen ... Sie können verschachtelte Eigenschaften über seinen Pfad in einer Bindung zugreifen, aber nicht, wenn Sie den Wert der Eigenschaft definieren.

Sie haben, so etwas zu tun:

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

Ja, das ist, was ich dachte. :-( Extra-DPs auf meinem Top-Level-Steuerelement ist es dann! – Swythan

+6

BTW. Ich kann es nicht wie in Ihrem Beispiel XAML, wie ich nicht den vorhandenen Wert der XAxis-Eigenschaft mit einem ersetzen möchten Neue Instanz von Axis – Swythan

+0

Ich frage mich, warum WPF die Bindung an die verschachtelten Eigenschaften nicht unterstützt, sonst werden sie dupliziert. – Vitalij