Pergunta

Estou aprendendo tudo sobre vinculação no WPF.Estou tendo muitos problemas para depurar os erros de análise em meu xaml.Alguém bonito pode me dizer o que há de errado com este pedacinho?:

<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>

É a ligação de dados que quebra.eu recebo um InvalidAttributeValue exceção para ThumbKnob.Height quando tento executar isso.Eu sei que devo estar perdendo algo fundamental.Então me informem, empilhadores, e minha gratidão será ilimitada.


Alterar o ElementName não ajudou.Deve haver algo mais que não estou entendendo.

Devo mencionar que estou testando isso no Silverlight.A mensagem exata que estou recebendo do Internet Explorer é:

XamlParseException: Invalid attribute value for property Height.

Tudo isso está dentro de um ControlTemplate.Estou fazendo um controle deslizante apenas para aprender os conceitos.

Foi útil?

Solução

A propriedade ElementName em uma ligação não tem suporte no Silverlight.

Você notará que, se entrar no código por trás ou inspecionar o objeto Binding no explorador de classes, ele não possui uma propriedade chamada ElementName.

Outras dicas

O que normalmente faço para depurar ligações de dados é adicionar um conversor onde posso definir um ponto de interrupção no VS.NET.

então a ligação seria algo assim:

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

Então o conversor pode ser uma implementação vazia de um IValueConverter, definir um ponto de interrupção no método Convert e ver como a Altura está sendo definida ...

Não se esqueça de adicionar seu conversor aos seus Recursos...

Talvez o valor seja NaN ?

Ok, o negócio é o seguinte:

No Silverlight, você não pode vincular valores de um elemento da interface do usuário a outro de forma declarativa.A única maneira de fazer o que eu estava tentando fazer aqui seria no código C#.

Eu tinha uma referência para isso ontem, mas agora acho que você só terá que acreditar na minha palavra :)

Hmm, pode haver uma diferença substancial entre WPF e Silverlight neste ponto.

Parece que não tenho problemas em compilar e executar este exemplo em uma janela 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>

Talvez o Silverlight tenha menos propriedades na classe Thumb...

http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.thumb.aspx

Antes de tudo é uma questão de carcaça...

Mudar

Part_Track
para
PART_Track
o que corrigirá seu erro de ligação.

Mas não acho que seja isso que você está tentando fazer.

Você poderia usar uma grade em vez de uma tela, e o polegar será dimensionado automaticamente.O Canvas realmente não tem altura, pois não se importa muito com a altura de seus filhos...

Espero que isto ajude...

A borda está em um modelo, aliás?

Porque não há necessidade de TemplateBinding se a borda não estiver localizada em um Template (ControlTemplate ou DataTemplate)

Silverlight 3 agora inclui ligação ElementName...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top