Qual é a sintaxe de ligação de valor em xaml?
-
08-06-2019 - |
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.
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...