2009-05-07 5 views
5

У меня есть элемент управления WPF, который предоставляет один из его дочерних элементов (из его ControlTemplate) через свойство только для чтения. На данный момент это просто свойство CLR, но я не думаю, что это имеет значение.Могу ли я использовать XAML для установки вложенного свойства (свойства значения свойства) элемента управления?

Я хочу иметь возможность установить одно из свойств дочернего элемента управления из XAML, где я создаю основной элемент управления. (На самом деле, я хотел бы привязать к нему, но я думаю, что его установка будет хорошим первым шагом.)

Вот код:

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

Вот два способа я могу думать о настройке вложенного имущество в XAML (не компилируется):

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

Возможно ли это?

Без этого я предполагаю, что мне просто нужно выставить DP на главном элементе управления, который привязан к детям (в шаблоне). Не так уж плохо, я думаю, но я просто пытался избежать взрыва свойств основного элемента управления.

Cheers.

ответ

4

Вы не можете сделать это так ... вы можете получить доступ к вложенным свойствам через свой путь в привязке, но не при определении значения свойства.

Вы должны сделать что-то вроде этого:

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

Да, вот что я подумал. :-( Дополнительные DP на моем верхнем уровне управления, это так! – Swythan

+6

BTW. Я не могу сделать это, как в вашем примере XAML, так как я не хочу заменять существующее значение свойства XAxis на новый экземпляр Axis. – Swythan

+0

Интересно, почему WPF не поддерживает привязку к вложенным свойствам? В противном случае вы в конечном итоге дублируете их. – Vitalij

Смежные вопросы