Usuário com melhor resposta
Binding num TextBlock

Pergunta
-
Boa tarde pessoal,
Alguém pode me enviar um exemplo simples de como enviar o nome do usuario (a parte de acesso ao banco eu não tenho problema)
para um "TextBlock" que está na que está na "MainPage.xaml".
exemplo.: Estou em uma Page (Silverligth) e quando o usuario digita seu login e senha (se for válido)
eu preciso enviar o seu nome para um TextBlock que está na MainPage.
estou fazendo um binding (configurado no TextBlock), mais nada acontece.
Valeu.
Respostas
-
Boa Tarde Otoni,
Do jeito que eu fiz, quando foi feito o login, a MainPage ainda não estava carregada e por isso funcionou. Se você estiver utilizando o login na Main também, este jeito não vai funcionar, poir o StaticResource não tem um "listener" para verificar se a propriedade foi alterada.
Para funcionar teria de utilizar um markup de binding chamado Static que somente funciona no WPF. Mesmo no silverlight 5 esta funcionalidade não é nativa, mas você pode montar esse markup.
Segue um exemplo:
http://slouge.wordpress.com/2011/04/20/silverlight-x-static-markupextension-like-wpf/
Existe também a possibilidade de criar um TextBlock estatico e adicionar ele via código em um container:
public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); LayoutRoot.Children.Add(TUsuarios.LabelLogin); } }
Assim sem binding:
public sealed class TUsuarios { private static string _nomeLogin; public static string nomeLogin { get { return _nomeLogin; } set { _nomeLogin = value; LabelLogin.Text = value; } } private static TextBlock labelLogin; public static TextBlock LabelLogin { get { if (labelLogin == null) labelLogin = new TextBlock(); labelLogin.Text = nomeLogin; return labelLogin; } } }
Se tiver utilizando o Silverlight 5, vale a pena tentar o exemplo.
Espero que ajude,
Atenciosamente,
Samuel Fabel
- Marcado como Resposta Otoni terça-feira, 6 de novembro de 2012 13:01
-
Boa noite Otoni,
Existe um template do silverlight chamado Silverlight Business Application. Esse template tem toda uma estrutura de loggin e segurança. Dê uma olhada. É bem interessante.
Espero que ajude,
Atenciosamente,
Samuel Fabel
- Marcado como Resposta Otoni terça-feira, 6 de novembro de 2012 13:05
Todas as Respostas
-
Boa tarde Otoni,
Tenta fazer um binding a uma propriedade estatica. Nesse link tem um exemplo de como isso funciona:
http://blogs.msdn.com/b/yl/archive/2009/07/22/x-type-and-x-static-in-silverlight.aspx
Espero que ajude,
Atenciosamente,
Samuel Fabel
-
Ola Samuel,
Valeu pela atenção... mas confesso q/ não entendi (desculpe minha ignorância)
estou começando agora.
O que quero fazer.?
a) usuario faz o login numa Page.xaml própria.
b) atraves de um serviço busco os dados do usuario no mysql
c) caso o usuario exista ???
------ate aqui tudo bem---------------------------------------------------
d) quero enviar o nome do usuario para um TextBlock existente na MainPage (Silverlight 5).
Alguém tem um exemplo simples????
Valeu pessoal.
-
Boa Noite Otoni,
Desculpa ter demorado responder antes. Segue um exemplo:
No exemplo que eu montei, utilizei o Silverlight Navigation Application, mas isso é irrelevante.
Vamos supor que o login ou nome do usuário logado que vai ficar na MainPage fique numa classe assim:
namespace SilverlightApplication2 { public sealed class UsuarioLogado { public static string Login { get; set; } } }
O primeiro passo para o binding é referenciar em algum lugar do xaml. No caso estarei colocando do xaml do App que pode ser vizualizado de qualquer xaml:
<Application x:Class="SilverlightApplication2.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:SilverlightApplication2"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Assets/Styles.xaml"/> </ResourceDictionary.MergedDictionaries> <local:UsuarioLogado x:Key="MeuUsuario" /> </ResourceDictionary> </Application.Resources> </Application>
Depois disso, você só precisa referenciar a propriedade no TextBlock:
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="auto" /> <ColumnDefinition Width="auto" /> </Grid.ColumnDefinitions> <TextBlock Text="Usuário Logado:" Foreground="White" VerticalAlignment="Center" /> <TextBlock Text="{Binding Path=Login, Source={StaticResource MeuUsuario}}" Foreground="White" Grid.Column="1" /> </Grid>
Para atribuir valor a propriedade basta passa valor como qualquer propriedade estatica:
UsuarioLogado.Login = loginTextBox.Text;
Espero que ajude,
Atenciosamente,
Samuel Fabel
-
Caro Samuel,
Quero agradecer pela sua atenção. ( tem alguma coisa errada no meu código , só não consigo ver onde está o erro, porque não funciona)
Minha Classe
namespace SLSVan { public sealed class TUsuarios { // [Display (Name="Usuario")] public static string nomeLogin { get;set;} } }
o xaml do meu APP
<Application x:Class="SLSVan.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:SLSVan"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Assets/Styles.xaml"/> </ResourceDictionary.MergedDictionaries> <local:TUsuarios x:Key="UsuarioAtivo"/> </ResourceDictionary> </Application.Resources> </Application>
e por fim meu TextBlock quee esta na MainPage
<Grid x:Name="gridusu" Background="#FF5794DE" Margin="0,42,0,0" Height="19" VerticalAlignment="Top" > <TextBlock Text="Usuário Logado.: " /> <TextBlock Name="txtbemvindo" Text="{Binding Path=nomeLogin, Source={StaticResource UsuarioAtivo }}" Grid.Column="1" /> <Grid.ColumnDefinitions> <ColumnDefinition Width="149*"/> <ColumnDefinition Width="171*"/> </Grid.ColumnDefinitions> </Grid>
estou atribuindo os dados que vem de um serviço
private void btnentrar_Click(object sender, RoutedEventArgs e) { Service1Client client = new Service1Client(); client.BuscaUsuCompleted += new EventHandler<BuscaUsuCompletedEventArgs>(client_BuscaUsu); client.BuscaUsuAsync(txtlogin.Text,txtsenha.Password); } void client_BuscaUsu (object sender, BuscaUsuCompletedEventArgs e) { if (e.Result.Count > 0) { string nome = ((TUsuario)e.Result[0]).nome_usu.ToString(); if (!nome.Equals(null)) { TUsuarios.nomeLogin = e.Result[0].nome_usu.ToString(); }
Me parece que está tudo certo, porque o código é quase uma cópia de seu exemplo, porem não funciona,
me dê uma força aí.
Valeu
Otoni
-
Boa Tarde Otoni,
Do jeito que eu fiz, quando foi feito o login, a MainPage ainda não estava carregada e por isso funcionou. Se você estiver utilizando o login na Main também, este jeito não vai funcionar, poir o StaticResource não tem um "listener" para verificar se a propriedade foi alterada.
Para funcionar teria de utilizar um markup de binding chamado Static que somente funciona no WPF. Mesmo no silverlight 5 esta funcionalidade não é nativa, mas você pode montar esse markup.
Segue um exemplo:
http://slouge.wordpress.com/2011/04/20/silverlight-x-static-markupextension-like-wpf/
Existe também a possibilidade de criar um TextBlock estatico e adicionar ele via código em um container:
public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); LayoutRoot.Children.Add(TUsuarios.LabelLogin); } }
Assim sem binding:
public sealed class TUsuarios { private static string _nomeLogin; public static string nomeLogin { get { return _nomeLogin; } set { _nomeLogin = value; LabelLogin.Text = value; } } private static TextBlock labelLogin; public static TextBlock LabelLogin { get { if (labelLogin == null) labelLogin = new TextBlock(); labelLogin.Text = nomeLogin; return labelLogin; } } }
Se tiver utilizando o Silverlight 5, vale a pena tentar o exemplo.
Espero que ajude,
Atenciosamente,
Samuel Fabel
- Marcado como Resposta Otoni terça-feira, 6 de novembro de 2012 13:01
-
Boa noite Otoni,
Existe um template do silverlight chamado Silverlight Business Application. Esse template tem toda uma estrutura de loggin e segurança. Dê uma olhada. É bem interessante.
Espero que ajude,
Atenciosamente,
Samuel Fabel
- Marcado como Resposta Otoni terça-feira, 6 de novembro de 2012 13:05
-
Grande Samuel,
Obrigado pela paciencia e ajuda.
consegui resolver o problema com este seu exemplo, era isto mesmo que eu queria. valeu.
Como te disse no inicio estou começando com o Silverlight ,estou sem material para estudo. alguma sugestão
de algum material em portugues.
Mais uma vez, obrigado.
-
Boa Tarde Otoni,
Segue um link do próprio msdn com uma introdução ao Silverlight. Dei uma olhada no material e aparentemente é bem simples de se entender:
http://msdn.microsoft.com/pt-br/library/cc580591.aspx
Espero que ajude,
Atenciosamente,
Samuel Fabel