xaml
Já aprendemos a passar informação dos campos do xaml
para o código e do código para os componentes do xaml
.
Nesta aula vamos aprender como criar uma ligação entre componentes do código e componentes do xaml
.
Esta ligação vai fazer com que os componentes atualizem automaticamente sem precisar de código.
Vamos ver um exemplo prático com os dados de uma pessoa.
Suponha que os tributos da classe pessoa são apenas nome
e idade
.
Vamos criar a seguinte interface com Nome de entrada e saída, também Idade de entrada e saída.
Pessoa
Vamos criar a classe Pessoa
com os atributos String Nome
e int idade
.
using System;
namespace WpfAppDataBinding.Data {
internal class Person {
public String Nome { get; set;}
private int idade;
public int Idade {
get { return idade; }
set {
if (value < 0) value = 0;
idade = value;
}
}
public Person(String aNome, int aIdade) {
this.Nome = aNome;
this.Idade = aIdade;
}
}
}
Neste exemplo usamos o modelo de criação de classes properties do C#.
Na definição do Nome
o get
e set
é feito de forma automática.
Usando o mesmo modelo configuramos o get
e set
da Idade para retornar 0 caso o valor entrado da idade for menor que 0.
No código abaixo criamos um objeto do tipo Person
e adicionamos este objeto no DataContext
da janela.
using System.Windows;
using WpfAppDataBinding.Data;
namespace WpfAppDataBinding {
public partial class MainWindow : Window {
Person person = new Person("Nome", 101);
public MainWindow() {
InitializeComponent();
this.DataContext = person;
}
private void OnInfoClicked(object sender, RoutedEventArgs e) {
MessageBox.Show($"{person.Nome} tem {person.Idade} anos");
}
}
}
xaml
No xaml
abaixo criamos uma ligação da entrada com os campos do DataContext
na direção do código fonte.
Assim como criamos uma ligação dos labels com os campos do DataContext
na direção do código C#
para o xaml
.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="10"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
<RowDefinition Height="*"/>
<RowDefinition Height="10"/>
</Grid.RowDefinitions>
<Label Content="Nome:" HorizontalAlignment="Right"
Grid.Column="1" Grid.Row="1"/>
<TextBox Name="NomeEntrada"
Text="{Binding Path=Nome, Mode=OneWayToSource}"
Grid.Column="3" Grid.Row="1"/>
<Label Content="Idade:" HorizontalAlignment="Right"
Grid.Column="1" Grid.Row="3"/>
<TextBox Name="IdadeEntrada"
Text="{Binding Path=Idade, Mode=OneWayToSource}"
Grid.Column="3" Grid.Row="3"/>
<Button Content="Info"
Grid.Column="1" Grid.Row="5" Grid.ColumnSpan="7"
Click="OnInfoClicked"
/>
<Label Content="Nome Saída:" HorizontalAlignment="Right"
Grid.Column="5" Grid.Row="1"/>
<Label
Content="{Binding Path=Nome, Mode=OneWay}"
Grid.Column="7" Grid.Row="1"/>
<Label Content="Idade Saída:" HorizontalAlignment="Right"
Grid.Column="5" Grid.Row="3"/>
<Label
Content="{Binding Path=Idade, Mode=OneWay}"
Grid.Column="7" Grid.Row="3"/>
</Grid>
Não é preciso fazer o Data Binding para passar informação do xaml
para o C#
, nem para o caminho contrário.
Mas temos certas vantagens em fazer isso: