Доступ к косвенному свойству из XAML — WPF

У меня есть класс управления с именем МойКонтроль, и он имеет прямое логическое свойство Аксессдиректпроперти и объект MyControlSettings.

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

Пожалуйста, ознакомьтесь с информацией о классе MyControlSettings

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

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

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

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

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

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

Потому что ControlSettings.AccessIndirectProperty не является собственностью/членом MyControl...

user2819245 20.02.2019 19:45

Боковое примечание: если вы собираетесь выполнить привязку к некоторым свойствам MyControl -- с этими свойствами, являющимися целью привязки -- вам нужно будет сделать эти свойства DependencyProperties...

user2819245 20.02.2019 19:48

Да, мне нужно установить AccessIndirectProperty в XAML. Есть ли способ добиться этого с помощью ControlSettings, который является свойством MyControl?

user4318630 20.02.2019 19:48

Не могли бы вы предоставить мне пример использования DependencyProperties для выполнения моего требования, упомянутого выше?

user4318630 20.02.2019 19:49

Я не знаю, чего вы пытаетесь достичь, поэтому я не могу сказать вам, что вы должны делать. Но, возможно, вы могли бы сделать ControlSettings.AccessIndirectProperty присоединенным свойством, с помощью которого можно было бы манипулировать состоянием MyControl и связанным с ним экземпляром MyControlSettings. Или, возможно, вы могли бы создать целый экземпляр MyControlSettings в XAML и установить его как <MyControl><ControlSettings><MyControlSettings SomeProperty = "true"/></ControlSettings></MyControl> Обратите внимание, что это создает и назначает новый объект MyControlSettings, он не изменяет существующий объект MyControlSettings.

user2819245 20.02.2019 19:52

Что касается DependencyProperties: здесь, в StackOverflow, есть много руководств/сообщений в блогах/документации и даже вопросов и ответов, связанных с DP. Поиск большого количества информации и примеров с помощью быстрого поиска в Google не займет много времени...

user2819245 20.02.2019 19:53

Кстати, мое примечание о DependencyProperties не касалось вашей проблемы, поэтому я объявил это примечанием. Речь шла о том, что вы можете захотеть выполнить привязку к этим свойствам вашего элемента управления (аналогично тому, что вы сделали бы с другими связываемыми свойствами стандартных элементов управления WPF), и в этом случае просто иметь обычное свойство недостаточно...

user2819245 20.02.2019 20:01

<MyControl><ControlSettings><MyControlSettings SomeProperty = "true"/></ControlSettings></MyControl>. Этот работал для моего случая. Спасибо

user4318630 20.02.2019 20:40

@elgonzo: Поскольку ваш комментарий решил проблему ОП, я предлагаю вам превратить свой комментарий в ответ, чтобы будущие читатели могли извлечь из этого пользу.

Heinzi 21.02.2019 09:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
116
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Боюсь, что 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
Ответ принят как подходящий

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

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

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

Другие вопросы по теме