【问题标题】:What is the value-binding syntax in xaml?xaml 中的值绑定语法是什么?
【发布时间】:2010-09-05 16:26:14
【问题描述】:

我正在全面了解 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>

破坏的是数据绑定。当我尝试运行它时,ThumbKnob.Height 出现InvalidAttributeValue 异常。我知道我一定错过了一些基本的东西。所以填上我,堆垛机,我的感激之情将无限。


更改 ElementName 没有帮助。我必须有其他我没有得到的东西。

我应该提到我正在 Silverlight 中对此进行测试。我从 Internet Explorer 中得到的确切消息是:

XamlParseException: Invalid attribute value for property Height.

整个事情都在 ControlTemplate 中。我正在制作一个滑块控件,只是为了自学概念。

【问题讨论】:

    标签: .net wpf silverlight xaml binding


    【解决方案1】:

    Silverlight 不支持 Binding 的 ElementName 属性。

    您会注意到,如果您进入后面的代码或在类资源管理器中检查 Binding 对象,它没有名为 ElementName 的属性。

    【讨论】:

    • 请注意:它在 Silverlight 4 中。(我认为是 3.5)
    【解决方案2】:

    我通常用来调试数据绑定,是添加一个转换器,我可以在 VS.NET 中设置断点..

    所以绑定会是这样的:

    {Binding ElementName=PART_Track, Path=Height, Mode=OneWay, Converter={StaticResources DebugConverter}}
    

    那么转换器可以是一个IValueConverter的空实现,在Convert方法中设置一个断点,看看Height被设置成什么...

    不要忘记将转换器添加到资源中...

    也许值是 NaN ?

    【讨论】:

      【解决方案3】:

      好的,这是交易:

      在silverlight 中,您不能以声明方式将值从一个UI 元素绑定到另一个。我在这里尝试做的唯一方法是在 C# 代码中。

      我昨天有一个参考,但现在我想你只需要相信我的话:)

      【讨论】:

        【解决方案4】:

        嗯,在这一点上 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

        【讨论】:

          【解决方案5】:

          首先是外壳问题...

          改变

          Part_Track
          PART_Track
          这将修复您的绑定错误..

          但我不认为这是你想要做的..

          您可以使用 Grid 代替画布,Thumb 会自动调整大小。 Canvas 并没有真正的高度,因为它并不真正关心其子项的高度......

          希望这会有所帮助...

          【讨论】:

            【解决方案6】:

            边框在模板中吗?

            因为如果边框不在模板(ControlTemplate 或 DataTemplate)中,则不需要 TemplateBinding

            【讨论】:

              【解决方案7】:

              Silverlight 3 现在包括 ElementName 绑定...

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-10-20
                • 2011-03-08
                • 1970-01-01
                • 2010-12-24
                • 1970-01-01
                • 2010-09-06
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多