Доступ к косвенному свойству из XAML - WPF - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть класс Control с именем MyControl , и у него есть прямое свойство bool AccessDirectProperty и объект MyControlSettings

    public class MyControl : Control
    {
        public bool AccessDirectProperty
        {
            get; set;
        }
        public MyControlSettings ControlSettings
        {
            get;set;
        }
    }

Найдите MyControlSettings сведения о классе

public class MyControlSettings
{
    public bool AccessIndirectProperty
    {
        get;set;
    }
}

Прямое свойство AccessDirectProperty может быть доступно из XAML без ошибок.

<Window>
    <Grid>
        <local:MyControl AccessDirectProperty="True"/>
    </Grid>
</Window>

Но я не могу получить доступсвойство AccessIndirectProperty из объекта ControlSettings в XAML.Приведенный ниже код не может этого сделать.

<Window>
    <Grid>
        <local:MyControl AccessDirectProperty="True" ControlSettings.AccessIndirectProperty=""/>
    </Grid>
</Window>

Может кто-нибудь помочь мне в этом?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Теперь на техническом уровне следующее не полезно для изменения свойства существующего экземпляра MyControlSettings , предоставляемого через MyControl.ControlSettings .Однако, если ваш вариант использования позволяет создать и назначить совершенно новый MyControlSettings экземпляру MyControl.ControlSettings , вы можете сделать это в XAML:

<local:MyControl>
    <ControlSettings>
        <local:MyControlSettings AccessIndirectProperty="true" />
    </ControlSettings>
</local:MyControl>

Сторонапримечание: термин « ControlSettings » подсказывает мне, что вы хотите «упаковать» настройки / свойства элемента управления в некий MyControlSettings «контейнер».Теперь я не знаю, почему и какова мотивация для этого, но имейте в виду, что выбор этого подхода может очень затруднить или даже сделать невозможным осмысленное использование привязок данных, когда такое свойство настроек должно бытьобязательная цель.Если вы хотите использовать отдельные настройки в качестве цели привязки (например, AccessIndirectProperty="{Binding Path=Source}"), я бы предпочел, чтобы ваш MyControl выставлял эти настройки индивидуально как DependencyProperties .

0 голосов
/ 20 февраля 2019

Боюсь, что XAML не поддерживает доступ к «вложенным» свойствам.

Однако вы можете сделать ControlSettings независимым классом с вложенными свойствами :

public class ControlSettings : DependencyObject
{
    public static readonly DependencyProperty AccessIndirectPropertyProperty =
        DependencyProperty.RegisterAttached(
              "AccessIndirectProperty", typeof(bool), typeof(ControlSettings),
              new PropertyMetadata(false));

    public static bool GetAccessIndirectProperty(DependencyObject d)
    {
        return (bool) d.GetValue(AccessIndirectPropertyProperty);
    }
    public static void SetAccessIndirectProperty(DependencyObject d, bool value)
    {
        d.SetValue(AccessIndirectPropertyProperty, value);
    }
}

Тогда

<local:MyControl x:Name="myControl" 
                 AccessDirectProperty="True" 
                 ControlSettings.AccessIndirectProperty="True" />

установит значение, к которому можно получить доступ через

var p = ControlSettings.GetAccessIndirectProperty(myControl); // yields True
...