У меня есть класс управления с именем МойКонтроль, и он имеет прямое логическое свойство Аксессдиректпроперти и объект 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>
Может ли кто-нибудь помочь мне в этом?
Боковое примечание: если вы собираетесь выполнить привязку к некоторым свойствам MyControl -- с этими свойствами, являющимися целью привязки -- вам нужно будет сделать эти свойства DependencyProperties...
Да, мне нужно установить AccessIndirectProperty в XAML. Есть ли способ добиться этого с помощью ControlSettings, который является свойством MyControl?
Не могли бы вы предоставить мне пример использования DependencyProperties для выполнения моего требования, упомянутого выше?
Я не знаю, чего вы пытаетесь достичь, поэтому я не могу сказать вам, что вы должны делать. Но, возможно, вы могли бы сделать ControlSettings.AccessIndirectProperty присоединенным свойством, с помощью которого можно было бы манипулировать состоянием MyControl и связанным с ним экземпляром MyControlSettings. Или, возможно, вы могли бы создать целый экземпляр MyControlSettings в XAML и установить его как <MyControl><ControlSettings><MyControlSettings SomeProperty = "true"/></ControlSettings></MyControl> Обратите внимание, что это создает и назначает новый объект MyControlSettings, он не изменяет существующий объект MyControlSettings.
Что касается DependencyProperties: здесь, в StackOverflow, есть много руководств/сообщений в блогах/документации и даже вопросов и ответов, связанных с DP. Поиск большого количества информации и примеров с помощью быстрого поиска в Google не займет много времени...
Кстати, мое примечание о DependencyProperties не касалось вашей проблемы, поэтому я объявил это примечанием. Речь шла о том, что вы можете захотеть выполнить привязку к этим свойствам вашего элемента управления (аналогично тому, что вы сделали бы с другими связываемыми свойствами стандартных элементов управления WPF), и в этом случае просто иметь обычное свойство недостаточно...
<MyControl><ControlSettings><MyControlSettings SomeProperty = "true"/></ControlSettings></MyControl>. Этот работал для моего случая. Спасибо
@elgonzo: Поскольку ваш комментарий решил проблему ОП, я предлагаю вам превратить свой комментарий в ответ, чтобы будущие читатели могли извлечь из этого пользу.





Боюсь, что 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}"), я бы предположил, что ваш МойКонтроль предоставляет эти настройки по отдельности как Свойства зависимости.
Потому что
ControlSettings.AccessIndirectPropertyне является собственностью/членомMyControl...