Вложенные свойства

Присоединенные свойства .NET Multi-platform App UI (.NET MAUI) позволяют объекту назначать значение для свойства, которое не определяет собственный класс. Например, дочерние элементы могут использовать присоединенные свойства для информирования родительского элемента о том, как они должны быть представлены в пользовательском интерфейсе. Макет Grid позволяет указать строку и столбец дочернего элемента, задав и Grid.Column присоединенные Grid.Row свойства. Grid.Row и Grid.Column являются присоединенными свойствами, так как они задаются на элементах, которые являются дочерними элементами Grid, а не сами по Grid себе.

Привязываемые свойства должны быть реализованы как присоединенные свойства в следующих сценариях:

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

Дополнительные сведения о привязываемых свойствах см. в разделе "Привязываемые свойства".

Создание присоединенного свойства

Процесс создания присоединенного свойства выглядит следующим образом:

  1. BindableProperty Создайте экземпляр с одной из CreateAttached перегрузок метода.
  2. Предоставьте staticGetметоды PropertyName и SetPropertyName в качестве методов доступа для присоединенного свойства.

Создание свойства

При создании присоединенного свойства для использования в других типах класс, от которого создается свойство, не требуется.BindableObject Однако целевое свойство для методов доступа должно быть производным или производным от. BindableObject Дополнительные сведения о целевых свойствах см. в разделе "Базовые привязки".

Присоединенное свойство можно создать, объявив public static readonly свойство типа BindableProperty. Привязываемое свойство должно быть задано возвращаемым значением одной из BindableProperty.CreateAttached перегрузок метода. Объявление должно находиться в теле собственного класса, но за пределами определений элементов.

Внимание

Соглашение об именовании присоединенных свойств заключается в том, что идентификатор присоединенного свойства должен соответствовать имени свойства, указанному в методе CreateAttached , с добавлением свойства к нему.

В следующем коде показан пример присоединенного свойства:

public class MyControl
{
    public static readonly BindableProperty HasShadowProperty =
        BindableProperty.CreateAttached("HasShadow", typeof(bool), typeof(MyControl), false);
}

При этом создается присоединенное свойство с именем HasShadowPropertyтипа bool. Свойство принадлежит классу MyControl и имеет значение falseпо умолчанию. В этом случае владение означает, что свойство будет обращаться в XAML с помощью формата Type.Property, например MyControl.HasShadow.

Дополнительные сведения о создании привязываемых свойств, включая параметры, которые можно указать во время создания, см. в разделе "Создание привязываемого свойства".

Создание методов доступа

Методы Static GetPropertyName и SetPropertyName требуются в качестве методов доступа для присоединенного свойства, в противном случае система свойств не сможет использовать присоединенное свойство. Метод Getдоступа PropertyName должен соответствовать следующей подписи:

public static valueType GetPropertyName(BindableObject target)

Метод Getдоступа PropertyName должен возвращать значение, содержащееся в соответствующем BindableProperty поле для присоединенного свойства. Это можно сделать путем вызова GetValue метода, передачи идентификатора привязываемого свойства, для которого требуется получить значение, а затем приведения результирующего значения к требуемому типу.

Метод Setдоступа PropertyName должен соответствовать следующей подписи:

public static void SetPropertyName(BindableObject target, valueType value)

Метод Setдоступа PropertyName должен задать значение соответствующего BindableProperty поля для присоединенного свойства. Это можно добиться, вызвав SetValue метод, передав идентификатор привязываемого свойства, для которого необходимо задать значение, и значение, которое необходимо задать.

Для обоих методов доступа целевой объект должен быть или производным от. BindableObject Дополнительные сведения о целевых объектах см. в разделе "Базовые привязки".

В следующем примере кода показаны методы доступа для присоединенного HasShadow свойства:

public class MyControl
{
    public static bool GetHasShadow(BindableObject view)
    {
        return (bool)view.GetValue (HasShadowProperty);
    }

    public static void SetHasShadow(BindableObject view, bool value)
    {
        view.SetValue(HasShadowProperty, value);
    }  
}

Использование присоединенного свойства

После создания присоединенного свойства его можно использовать из XAML или кода. В XAML это достигается путем объявления пространства имен с префиксом, с объявлением пространства имен, указывающим имя пространства имен CLR и необязательно имя сборки. Дополнительные сведения см. в разделе "Пространства имен XAML".

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

<ContentPage ... xmlns:local="clr-namespace:ShadowDemo" ...>
  ...
</ContentPage>

Затем объявление пространства имен используется при настройке присоединенного свойства для определенного элемента управления, как показано в следующем XAML:

<Label Text="Label with shadow" local:MyControl.HasShadow="true" />

Эквивалентный код на языке C# показан в следующем примере:

Label label = new Label { Text = "Label with shadow" };
MyControl.SetHasShadow (label, true);

Использование присоединенного свойства со стилем

Присоединенные свойства также можно добавить в элемент управления по стилю. В следующем примере кода XAML показан явный стиль элементов Label управления, использующих присоединенное HasShadow свойство:

<Style x:Key="ShadowStyle" TargetType="Label">
  <Style.Setters>
    <Setter Property="local:MyControl.HasShadow" Value="true" />
  </Style.Setters>
</Style>

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

<Label Text="Label with shadow" Style="{StaticResource ShadowStyle}" />

Дополнительные сведения о стилях см. в статье Стили .

Расширенные сценарии

При создании присоединенного свойства существуют некоторые необязательные параметры, которые можно задать для включения расширенных сценариев присоединенного свойства. К ним относятся обнаружение изменений свойств, проверка значений свойств и принудительное выполнение значений свойств. Дополнительные сведения см. в дополнительных сценариях.