Могу ли я использовать XAML для установки вложенного свойства (свойства значения свойства) элемента управления?
-
08-07-2019 - |
Вопрос
У меня есть элемент управления 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 в главном элементе управления, которые будут привязаны к дочерним элементам (в шаблоне).Не так уж плохо, я думаю, но я просто пытался избежать взрыва свойств в главном элементе управления.
Ваше здоровье.
Решение
Ты не можешь сделать это вот так...вы можете получить доступ к вложенным свойствам через их путь в привязке, но не тогда, когда вы определяете значение свойства.
Ты должен сделать что-то подобное :
<local:ChartControl>
<local:ChartControl.XAxis>
<local:Axis Maximum="{Binding Maximum}"/>
</local:ChartControl.XAxis>
</local:ChartControl>