Usuário com melhor resposta
Acessar propriedades dentro de um DataTemplate

Pergunta
-
Pessoal, como consigo acessar propriedades pelo C# de um objeto (TextBlock, por exemplo) dentro de um DataTemplate no XAML?
Abaixo segue o exemplo:
<controls:PanoramaItem x:Name="panitemMetas"> <controls:PanoramaItem.HeaderTemplate> <DataTemplate> <StackPanel> <TextBlock x:Name="headerMetas" Text="metas"></TextBlock> <StackPanel Orientation="Horizontal"> <coding4fun:RoundButton x:Name="btnMetaAdd" Margin="10,0,0,0" ImageSource="/Toolkit.Content/ApplicationBar.Add.png" BorderBrush="Transparent" PressedBrush="Transparent" Tap="btnMetaAdd_Tap"></coding4fun:RoundButton> <coding4fun:RoundButton x:Name="btnMetaUpd" Margin="10,0,0,0" ImageSource="/Toolkit.Content/appbar.edit.png" BorderBrush="Transparent" PressedBrush="Transparent" Tap="btnMetaUpd_Tap"></coding4fun:RoundButton> <coding4fun:RoundButton x:Name="btnMetaDel" Margin="10,0,0,0" ImageSource="/Toolkit.Content/appbar.delete.png" BorderBrush="Transparent" PressedBrush="Transparent" Tap="btnMetaDel_Tap"></coding4fun:RoundButton> <coding4fun:RoundButton x:Name="btnMetaCam" Margin="10,0,0,0" ImageSource="/Toolkit.Content/appbar.camera.png" BorderBrush="Transparent" PressedBrush="Transparent" Tap="btnMetaCam_Tap"></coding4fun:RoundButton> <coding4fun:RoundButton x:Name="btnMetaLib" Margin="10,0,0,0" ImageSource="/Toolkit.Content/appbar.image.png" BorderBrush="Transparent" PressedBrush="Transparent" Tap="btnMetaLib_Tap"></coding4fun:RoundButton> </StackPanel> </StackPanel> </DataTemplate> </controls:PanoramaItem.HeaderTemplate>
Neste exemplo criei um HeaderTemplate no PanoramaItem.
Obrigado!
Andrey Kurka (MCC) | Federal Case | @federalcaseinfo
terça-feira, 18 de março de 2014 21:28
Respostas
-
O projeto está pronto... eu só precisava implementar novos idiomas. Só por estar dentro de um DataTemplate é meio absurdo não poder fazer referência aos objetos pelo C#, mas paciência... Fica minha primeira decepção em anos. Grato.
Andrey Gonçalves dos Santos | Federal Case Mantenha o Fórum organizado e útil, marcando a resposta correta quando atender sua dúvida
Na verdade não é absurdo, e está certo ser assim. Um DataTemplate só tem acesso ao DataContext dele. O objetivo de um DataTemplate é mostrar um dado específico.
O que aconteceu aí foi falta de planejamento. Eu tive uma ideia que talvez funcione. Por que você está usando DataTemplate? Se você colocar os dois StackPanel dentro de um Grid na propriedade Header do controle PanoramaItem, talvez consiga solucionar...
Herbert Lausmann
- Marcado como Resposta Andrey Gonçalves dos Santos sábado, 22 de março de 2014 15:40
sábado, 22 de março de 2014 09:36
Todas as Respostas
-
-
Não... fazer Binding é trivial... eu criei este HeaderTemplate e preciso acessar as propriedades dos controles dentro dele (por exemplo, headerMetas.Text) através do C#. No entanto, os componentes criados dentro do Template não estão acessíveis pelo C#...
Andrey Kurka (MCC) | Federal Case | @federalcaseinfo
- Editado Andrey Gonçalves dos Santos terça-feira, 18 de março de 2014 23:14
terça-feira, 18 de março de 2014 23:09 -
- Sugerido como Resposta Giovani Cr quarta-feira, 19 de março de 2014 17:29
- Não Sugerido como Resposta Andrey Gonçalves dos Santos sexta-feira, 21 de março de 2014 22:40
quarta-feira, 19 de março de 2014 14:04 -
Não funcionou. Não sei se por ser XAML no Windows Phone tenha alguma diferença, mas estou anexando o código e a imagem com o erro.
<controls:PanoramaItem.HeaderTemplate> <DataTemplate> <StackPanel> <TextBlock x:Name="headerMetas" Text="metas"></TextBlock> <x:Code> <![CDATA[ private void MainPage_Loaded(object sender, RoutedEventArgs e) { headerMetas.Text = dicionario.headerMainMetas; } ]]> </x:Code> <StackPanel Orientation="Horizontal"> <coding4fun:RoundButton x:Name="btnMetaAdd" Margin="10,0,0,0" ImageSource="/Toolkit.Content/ApplicationBar.Add.png" BorderBrush="Transparent" PressedBrush="Transparent" Tap="btnMetaAdd_Tap"></coding4fun:RoundButton> <coding4fun:RoundButton x:Name="btnMetaUpd" Margin="10,0,0,0" ImageSource="/Toolkit.Content/appbar.edit.png" BorderBrush="Transparent" PressedBrush="Transparent" Tap="btnMetaUpd_Tap"></coding4fun:RoundButton> <coding4fun:RoundButton x:Name="btnMetaDel" Margin="10,0,0,0" ImageSource="/Toolkit.Content/appbar.delete.png" BorderBrush="Transparent" PressedBrush="Transparent" Tap="btnMetaDel_Tap"></coding4fun:RoundButton> <coding4fun:RoundButton x:Name="btnMetaCam" Margin="10,0,0,0" ImageSource="/Toolkit.Content/appbar.camera.png" BorderBrush="Transparent" PressedBrush="Transparent" Tap="btnMetaCam_Tap"></coding4fun:RoundButton> <coding4fun:RoundButton x:Name="btnMetaLib" Margin="10,0,0,0" ImageSource="/Toolkit.Content/appbar.image.png" BorderBrush="Transparent" PressedBrush="Transparent" Tap="btnMetaLib_Tap"></coding4fun:RoundButton> </StackPanel> </StackPanel> </DataTemplate> </controls:PanoramaItem.HeaderTemplate>
Andrey Gonçalves dos Santos | Federal Case Mantenha o Fórum organizado e útil, marcando a resposta correta quando atender sua dúvida
sexta-feira, 21 de março de 2014 22:42 -
É, eu estava programando um projeto em WPF hoje e resolvi testar essa tag x:Code, mas não existe! Acho que ela só existe no Framework mais recente.
Se você usar o padrão MVVM no seu projeto é certeza que vai conseguir contornar este problema. Mas aí depende se isso é viável para você...
Herbert Lausmann
sexta-feira, 21 de março de 2014 23:18 -
É, eu estava programando um projeto em WPF hoje e resolvi testar essa tag x:Code, mas não existe! Acho que ela só existe no Framework mais recente.
Se você usar o padrão MVVM no seu projeto é certeza que vai conseguir contornar este problema. Mas aí depende se isso é viável para você...
Herbert Lausmann
sexta-feira, 21 de março de 2014 23:18 -
O projeto está pronto... eu só precisava implementar novos idiomas. Só por estar dentro de um DataTemplate é meio absurdo não poder fazer referência aos objetos pelo C#, mas paciência... Fica minha primeira decepção em anos. Grato.
Andrey Gonçalves dos Santos | Federal Case Mantenha o Fórum organizado e útil, marcando a resposta correta quando atender sua dúvida
sexta-feira, 21 de março de 2014 23:27 -
O projeto está pronto... eu só precisava implementar novos idiomas. Só por estar dentro de um DataTemplate é meio absurdo não poder fazer referência aos objetos pelo C#, mas paciência... Fica minha primeira decepção em anos. Grato.
Andrey Gonçalves dos Santos | Federal Case Mantenha o Fórum organizado e útil, marcando a resposta correta quando atender sua dúvida
Na verdade não é absurdo, e está certo ser assim. Um DataTemplate só tem acesso ao DataContext dele. O objetivo de um DataTemplate é mostrar um dado específico.
O que aconteceu aí foi falta de planejamento. Eu tive uma ideia que talvez funcione. Por que você está usando DataTemplate? Se você colocar os dois StackPanel dentro de um Grid na propriedade Header do controle PanoramaItem, talvez consiga solucionar...
Herbert Lausmann
- Marcado como Resposta Andrey Gonçalves dos Santos sábado, 22 de março de 2014 15:40
sábado, 22 de março de 2014 09:36 -
Herbert, não foi falta de planejamento, amigo... É pesquisa mesmo... O HeaderTemplate preserva as características de fonte do Header e era isso que eu queria criando um Header com botões... Mas é uma pesquisa. Fazer a construção com StackPanel certamente dá certo mas não me levaria a aprender nada novo. Mesmo assim obrigado pela ajuda.
Andrey Gonçalves dos Santos | Federal Case Mantenha o Fórum organizado e útil, marcando a resposta correta quando atender sua dúvida
sábado, 22 de março de 2014 15:38