【发布时间】:2011-09-20 19:47:51
【问题描述】:
这可能很明显...以后如何在同一个 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" 的引用。
编辑:
感谢我在 XAML 上阅读的一些答案。
毕竟,显然可以通过名称引用前一个元素:
Grid.Row="{Binding ElementName=someGridRow}"
或
Grid.Row="{x:Reference someGridRow}"
但这并不能完全解决问题,因为 Grid.Row 需要一个 int,而 someGridRow 不是一个 int,它是一个 System.Windows.Controls.RowDefinition。
所以需要的是与
等效的 XAMLGrid.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>
在 XAML 2009 中,<Binding ElementName="someGridRow"/> 也可以替换为 <x:Reference Name="someGridRow"/>。
【问题讨论】:
-
我认为所有这些都不会起作用,因为属性路径不允许调用像
IndexOf这样的方法。