Чтобы немного рассказать о том, что Алекс сказал:
Для XML нет значения точки в имени элемента. a
, a.
, a.b
и a.b.c
являются допустимыми (и уникальными) именами элементов.
Для XAML , существует значительное значение для периода в имени элемента. По иронии судьбы рекомендация Алекса, предупреждающая вас об отказе от использования символов точки в вашем XML, в точности , почему XAML использует точки: так что XamlReader
может определить, когда он видит first.name
, что name
является свойством объекта first
. Следовательно:
<ListBox>
<ListBox.BorderThickness>2</ListBox.BorderThickness>
<ListBox.BorderBrush>Yellow</ListBox.BorderBrush>
<TextBox>foo</TextBox>
<TextBox>bar</TextBox>
<TextBox>baz</TextBox>
</ListBox>
Почему ты не можешь просто сделать это?
<ListBox>
<BorderThickness>2</BorderThickness>
...
Есть две причины. Первый - это простой дизайн XML: элементы XML могут содержать несколько элементов с одинаковыми именами. На самом деле плохая идея моделировать свойства как дочерние элементы, потому что тогда вам нужно обеспечить уникальность в вашей схеме или иметь правило, что делать со свойством объекта, когда есть несколько дочерних элементов с одинаковым именем:
<ListBox>
<BorderThickness>2</BorderThickness>
<BorderThickness>3</BorderThickness>
<BorderThickness>4</BorderThickness>
...
Вот почему XAML моделирует свойства как атрибуты , для которых XML должен быть уникальным:
<ListBox BorderThickness='2' BorderBrush='Yellow'...
(Кстати, существует проблема с использованием атрибутов в XAML: если свойства объекта должны быть установлены в определенном порядке, вы не должны использовать атрибуты для их представления. бывает , что XamlReader
читает атрибуты в том порядке, в котором они появляются в элементе, и назначает их свойствам в этом порядке. Но инструменты, которые читают и пишут XML, не гарантируют сохранение порядка атрибутов. Это означает, что человек который задал этот тревожный вопрос, может потерпеть неудачу.)
Другая причина состоит в том, что так много объектов WPF являются контейнерами других объектов. Если бы XAML позволял элементам представлять свойства, вы бы облажались, если бы вам нужно было представить объект, у которого было свойство с тем же именем, что и у класса объекта, который он мог содержать. Например, вы можете создать ItemsControl
со свойством Label
, но что произойдет, если вы захотите сохранить Label
объекты в его свойстве Items
? Эта неопределенность не может возникнуть в XAML:
<MyItemsControl>
<MyItemsControl.Label>this is a property of MyItemsControl</MyItemsControl.Label>
<Label>this is an item that MyItemsControl contains</Label>
</MyItemsControl>