Могу ли я использовать XAML для установки вложенного свойства (свойства значения свойства) элемента управления? - PullRequest
5 голосов
/ 07 мая 2009

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

Я хочу иметь возможность установить одно из свойств дочернего элемента управления из 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 на главном элементе управления, который связан с дочерними элементами (в шаблоне) Думаю, не так уж и плохо, но я просто пытался избежать взрыва свойств на главном элементе управления.

Приветствие.

1 Ответ

4 голосов
/ 07 мая 2009

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

Вы должны сделать что-то подобное:

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