2

私は、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でテストしていることに言及する必要があります。InternetExplorerから取得する正確なメッセージは次のとおりです。

XamlParseException: Invalid attribute value for property Height.

このすべてがControlTemplate内にあります。私は自分自身に概念を教えるためだけにスライダーコントロールを作っています。

4

7 に答える 7

2

Binding の ElementName プロパティは、Silverlight ではサポートされていません。

コード ビハインドに移動するか、クラス エクスプローラーで Binding オブジェクトを調べると、ElementName という名前のプロパティがないことに気付くでしょう。

于 2008-08-12T04:33:00.357 に答える
1

うーん、この点で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

于 2008-08-11T14:58:21.593 に答える
1

データバインディングをデバッグするために私が通常行うことは、VS.NETでブレークポイントを設定できるコンバーターを追加することです。

したがって、バインディングは次のようになります。

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

次に、コンバーターはIValueConverterの空の実装であり、Convertメソッドにブレークポイントを設定し、Heightが何に設定されているかを確認します...

コンバーターをリソースに追加することを忘れないでください...

おそらく値はNaNですか?

于 2008-08-11T13:56:55.617 に答える
1

わかりました、これが取引です:

Silverlight では、ある UI 要素から別の UI 要素に値を宣言的にバインドすることはできません。私がここでやろうとしていたことを行う唯一の方法は、C# コードを使用することです。

私は昨日これについての参照を持っていましたが、今は私の言葉を信じてもらう必要があると思います:)

于 2008-08-12T12:00:26.977 に答える
0

まず第一に、それはケーシングの問題です...

変化する

Part_Track
PART_Track
これにより、バインディングエラーが修正されます。

しかし、私はこれがあなたがやろうとしていることだとは思いません。

キャンバスの代わりにグリッドを使用すると、Thumbのサイズが自動的に設定されます。Canvasには実際には高さがありません。これは、子の高さを実際には気にしないためです...

お役に立てれば...

于 2008-08-11T13:26:38.393 に答える
0

テンプレートの境界線はありますか?

境界線がテンプレート(ControlTemplateまたはDataTemplate)にない場合は、TemplateBindingは必要ないためです。

于 2008-08-11T13:35:27.550 に答える
0

Silverlight 3 には ElementName バインディングが含まれるようになりました...

于 2010-02-17T22:44:50.493 に答える