문제

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 안에 있습니다.나는 개념을 스스로 가르치기 위해 슬라이더 컨트롤을 만들고 있습니다.

도움이 되었습니까?

해결책

Binding의 ElementName 속성은 Silverlight에서 지원되지 않습니다.

코드 숨김으로 이동하거나 클래스 탐색기에서 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
그러면 바인딩 오류가 해결됩니다.

그런데 이게 님이 하려는 일이 아닌가 싶습니다..

캔버스 대신 그리드를 사용할 수 있으며 Thumb의 크기가 자동으로 조정됩니다.캔버스에는 실제로 키가 없습니다. 왜냐하면 자식의 키에는 별로 관심이 없기 때문입니다.

도움이 되었기를 바랍니다...

템플릿에 테두리가 있나요?

테두리가 템플릿(ControlTemplate 또는 DataTemplate)에 없으면 TemplateBinding이 필요하지 않기 때문입니다.

Silverlight 3에는 이제 ElementName 바인딩이 포함되어 있습니다...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top