Поделиться через


Директива x:Arguments

Пакеты аргументов построения для объявления элемента объекта конструктора без параметров в XAML или для объявления объекта метода фабрики.

Использование элементов XAML (конструктор nonparameterless)

<object ...>
  <x:Arguments>
    oneOrMoreObjectElements
  </x:Arguments>
</object>

Использование элементов XAML (метод фабрики)

<object x:FactoryMethod="methodName"...>
  <x:Arguments>
    oneOrMoreObjectElements
  </x:Arguments>
</object>

Значения XAML

Ценность Описание
oneOrMoreObjectElements Один или несколько элементов объекта, которые указывают аргументы, передаваемые в резервный конструктор без параметров или метод фабрики.

Обычное использование — использовать текст инициализации в элементах объекта для указания фактических значений аргументов. См. раздел "Примеры".

Порядок элементов имеет важное значение. Типы XAML в порядке должны соответствовать типам и порядкам типов резервного конструктора или перегрузки метода фабрики.
methodName Имя метода фабрики, который должен обрабатывать любые x:Arguments аргументы.

Зависимости

x:FactoryMethod может изменить область и поведение, в котором применяется x:Arguments.

Если x:FactoryMethod не указан, x:Arguments применяется к альтернативным (не по умолчанию) подписям резервных конструкторов.

Если указан x:FactoryMethod, x:Arguments применяется к перегрузке именованного метода.

Замечания

XAML 2006 может поддерживать инициализацию по умолчанию с помощью текста инициализации. Однако практическое применение метода построения текста инициализации ограничено. Текст инициализации рассматривается как одна текстовая строка; Таким образом, он добавляет возможность только для инициализации одного параметра, если преобразователь типов не определен для поведения построения, который может анализировать пользовательские информационные элементы и пользовательские разделители из строки. Кроме того, текстовая строка логики объекта потенциально является собственным преобразователем типов синтаксического анализатора XAML для обработки примитивов, отличных от истинной строки.

Использование x:Arguments XAML не является использованием элемента свойства в обычном смысле, так как разметка директивы не ссылается на тип элемента объекта. Это более похоже на другие директивы, такие как x:Code, где элемент демаркирует диапазон, в котором разметка должна быть интерпретирована как не по умолчанию для дочернего содержимого. В этом случае тип XAML каждого элемента объекта передает сведения о типах аргументов, которые используются средствами синтаксического анализа XAML для определения сигнатуры конкретного метода фабрики конструктора, x:Arguments использование пытается ссылаться.

x:Arguments для создаваемого элемента объекта должны предшествовать любым другим элементам свойства, содержимому, внутреннему тексту или строкам инициализации элемента объекта. Элементы объекта в x:Arguments могут включать атрибуты и строки инициализации, как разрешено этим типом XAML и его резервным конструктором или методом фабрики. Для объекта или аргументов можно указать пользовательские типы XAML или типы XAML, которые находятся вне пространства имен XAML по умолчанию, ссылаясь на установленные сопоставления префиксов.

Обработчики XAML используют следующие рекомендации, чтобы определить, как аргументы, указанные в x:Arguments, должны использоваться для создания объекта. Если указан x:FactoryMethod, данные сравниваются с указанным x:FactoryMethod (обратите внимание, что значение x:FactoryMethod — имя метода, а именованный метод может иметь перегрузки. Если x:FactoryMethod не задано, данные сравниваются с набором всех перегрузок общедоступного конструктора объекта. Затем логика обработки XAML сравнивает количество параметров и выбирает перегрузку с сопоставлением arity. При наличии нескольких совпадений обработчик XAML должен сравнить типы параметров на основе типов XAML предоставленных элементов объекта. Если по-прежнему существует несколько совпадений, поведение процессора XAML не определено. Если указан x:FactoryMethod, но метод не может быть разрешен, обработчик XAML должен вызвать исключение.

Использование атрибута XAML <x:Arguments>string</x:Arguments> технически возможно. Однако это не обеспечивает никаких возможностей, кроме того, что можно сделать в противном случае с помощью преобразователей текста и типов инициализации, и использование этого синтаксиса не является намерением конструктора функций метода фабрики XAML 2009.

Примеры

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

public class Food {
  private string _name;
  private Int32 _calories;
  public Food(string name, Int32 calories) {
      _name=name;
      _calories=calories;
  }
}
<my:Food>
  <x:Arguments>
      <x:String>Apple</x:String>
      <x:Int32>150</x:Int32>
  </x:Arguments>
</my:Food>

В следующем примере показана сигнатура метода целевой фабрики, а затем использование XAML x:Arguments, которая обращается к этой сигнатуре.

public Food TryLookupFood(string name)
{
switch (name) {
  case "Apple": return new Food("Apple",150);
  case "Chocolate": return new Food("Chocolate",200);
  case "Cheese": return new Food("Cheese", 450);
  default: {return new Food(name,0);
}
}
<my:Food x:FactoryMethod="TryLookupFood">
  <x:Arguments>
      <x:String>Apple</x:String>
  </x:Arguments>
</my:Food>

См. также