xaml 中的值绑定语法是什么?
-
08-06-2019 - |
题
我正在了解 WPF 中的绑定。不过,我在调试 xaml 中的解析错误时遇到了很多麻烦。有人可以告诉我这个小部件有什么问题吗?:
<Border Name="TrackBackground"
Margin="0"
CornerRadius="2"
Grid.Row="1"
Grid.Column="1"
Background="BlanchedAlmond"
BorderThickness="1"
Height="{TemplateBinding Height}">
<Canvas Name="PART_Track" Background="DarkSalmon" Grid.Row="1" Grid.Column="1">
<Thumb Name="ThumbKnob" Height="{Binding ElementName=Part_Track, Path=Height, Mode=OneWay}" />
</Canvas>
</Border>
破坏的是数据绑定。我得到一个 InvalidAttributeValue
当我尝试运行此程序时,ThumbKnob.Height 出现异常。我知道我一定错过了一些基本的东西。所以,堆垛机们,请告诉我,我的感激之情将是无限的。
更改 ElementName 没有帮助。一定还有其他我没有得到的东西。
我应该提到我正在 Silverlight 中对此进行测试。我从 Internet Explorer 得到的确切消息是:
XamlParseException: Invalid attribute value for property Height.
整个事情都在 ControlTemplate 内。我正在制作一个滑块控件只是为了自学这些概念。
解决方案
Silverlight 不支持 Binding 上的 ElementName 属性。
您会注意到,如果您进入后面的代码或在类资源管理器中检查 Binding 对象,它没有名为 ElementName 的属性。
其他提示
我通常用来调试数据绑定的方法是添加一个转换器,我可以在 VS.NET 中设置断点。
所以绑定会是这样的:
{Binding ElementName=PART_Track, Path=Height, Mode=OneWay, Converter={StaticResources DebugConverter}}
然后转换器可以是 IValueConverter 的空实现,在 Convert 方法中设置断点并查看高度设置为多少...
不要忘记将转换器添加到您的资源中...
也许该值是 NaN ?
好的,交易是这样的:
在 silverlight 中,您无法以声明方式将一个 UI 元素的值绑定到另一个 UI 元素。完成我在这里尝试做的事情的唯一方法是使用 C# 代码。
我昨天有一个参考,但现在我想你只需要相信我的话:)
嗯,在这一点上,WPF 和 Silverlight 之间可能存在重大差异。
即使在 WPF 窗口中编译并运行此示例,我似乎也没有遇到任何问题:
<Slider Width="400" Height="20">
<Slider.Template>
<ControlTemplate>
<Border Name="TrackBackground"
Margin="0"
CornerRadius="2"
Grid.Row="1"
Grid.Column="1"
Background="BlanchedAlmond"
BorderThickness="1">
<Canvas x:Name="PART_Track" Background="DarkSalmon" Grid.Row="1" Grid.Column="1">
<Thumb Name="ThumbKnob" Height="{Binding ElementName=PART_Track, Path=Height, Mode=OneWay}" />
</Canvas>
</Border>
</ControlTemplate>
</Slider.Template>
</Slider>
也许 Silverlight 在 Thumb 类中的属性较少......
http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.thumb.aspx
首先是外壳的问题...
改变
Part_Track
到 PART_Track
这将修复您的绑定错误..
但我不认为这就是你想要做的。
您可以使用网格代替画布,并且拇指会自动调整大小。Canvas 并没有真正的高度,因为它并不真正关心它的孩子的高度......
希望这可以帮助...
顺便说一句,边框是模板中的吗?
因为如果边框不在模板(ControlTemplate 或 DataTemplate)中,则不需要 TemplateBinding
Silverlight 3 现在包含 ElementName 绑定...