none
Acessar propriedades dentro de um DataTemplate RRS feed

  • 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

    Meu BlogMeu perfil no Facebook

    sábado, 22 de março de 2014 09:36

Todas as Respostas

  • Olá,

    O que você quer dizer com acessar propriedades? Você quer fazer DataBinding?


    Herbert Lausmann

    Meu BlogMeu perfil no Facebook

    terça-feira, 18 de março de 2014 21:36
  • 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


    terça-feira, 18 de março de 2014 23:09
  • Ata, você quer acessar os controles do HeaderTemplate através do code behind (.cs) assim como se faz em um UserControl que tem o XAML e o arquivo .CS respectivo. É isso?

    Se for, não é possível!

    No entanto, talvez usar a diretiva x:Code seja suficiente para você. Veja:

    Code-Behind and XAML in WPF


    Herbert Lausmann

    Meu BlogMeu perfil no Facebook

    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

    Meu BlogMeu perfil no Facebook

    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

    Meu BlogMeu perfil no Facebook

    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

    Meu BlogMeu perfil no Facebook

    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