Это может быть очевидно ... Как я могу ссылаться на элементы XAML позже в том же файле XAML?
Пример:
<Grid.RowDefinitions>
<RowDefinition Height="661*" Name="someGridRow" />
<RowDefinition Height="230*" Name="someOtherGridRow"/>
</Grid.RowDefinitions>
Затем я определяю различные элементы управления внутри сетки, и я хотел бы ссылаться на эти строки по имени, а не по номеру:
<RichTextBox Grid.Row="someGridRow" ... />
Потому что, если я использую Grid.Row="0"
на многих элементах управления, то, когда я добавляю строку перед первой строкой, я должен вручную изменить все ссылки на Grid.Row="1"
.
EDIT
Благодаря ответам, которые я немного читаю на XAML.
В конце концов, существует возможность ссылаться на предыдущий элемент по имени, по-видимому:
Grid.Row="{Binding ElementName=someGridRow}"
или
Grid.Row="{x:Reference someGridRow}"
но это не решает проблему полностью, потому что Grid.Row требует int, тогда как someGridRow не является int, это System.Windows.Controls.RowDefinition.
Итак, нужен XAML-эквивалент
Grid.Row = grid.RowDefinitions.IndexOf(someGridRow)
который в коде будет написан
Grid.SetRow(richTextBox, grid.RowDefinitions.IndexOf(someGridRow))
или выполните привязку Grid.Row
к свойству объекта grid
, который имеет путь "RowDefinitions.IndexOf"
с параметром someGridRow
:
PropertyPath path = new PropertyPath("RowDefinitions.IndexOf", someGridRow);
Binding binding = new Binding() { ElementName = "grid", Path = path };
richTextBox.SetBinding(Grid.RowProperty, binding);
(это на самом деле не работает в C #, поэтому я, должно быть, что-то делаю не так, хотя Grid.SetRow
выше работает)
XAML 2009 определяет <x:Arguments>
для вызова конструкторов, имеющих параметры. Если бы это работало в WPF XAML, то что-то подобное сработало бы?
<Grid.Row>
<Binding ElementName="grid">
<Binding.Path>
<PropertyPath>
<x:Arguments>
RowDefinitions.IndexOf
<Binding ElementName="someGridRow"/>
</x:Arguments>
</PropertyPath>
</Binding.Path>
</Binding>
</Grid.Row>
, где <Binding ElementName="someGridRow"/>
также можно заменить на <x:Reference Name="someGridRow"/>
в XAML 2009.