Stwórz nowy projekt.
- dodaj 2 Labele, 2 TextBoxy i Button mniej więcej tak jak na rysunku:
- grid nazwij jako
GridOsoba
- dla TextBoxów zmień artybut
Text
na{Binding Imie}
i{Binding Wiek}
odpowiednio. Nazwij jeImieT
iWiekT
. - dodaj klasę
Osoba
, nie twórz tam pól, a jedynie właściwości, przykładowy kod:
class Osoba
{
public string Imie { get; set; }
public int Wiek { get; set; }
public Osoba(string imie, int wiek)
{
Imie = imie;
Wiek = wiek;
}
public override string ToString()
{
return String.Format("Imię: {0}, Wiek: {1}",Imie,Wiek);
}
}
- w klasie
MainWindow
dodaj prywatne pole:private Osoba o1 = null;
, następnie dodaj metodę:
private void PrzygotujWiazanie()
{
o1 = new Osoba("Jan",20); //domyślne wartości
GridOsoba.DataContext = o1;
}
następnie wywołaj metodę PrzygotujWiazanie()
w konstruktorze MainWindow
.
- stwórz metodę wykonywaną po kliknięciu w przycisk, we wnętrzu dodaj:
string tekst = String.Format("{0}{1}{2}", "Wprowadzono dane:", Environment.NewLine, o1.ToString());
MessageBox.Show(tekst);
- przestuj działanie programu, co się dzieje gdy wpiszemy wiek jako litery?
- dodaj do programu nową TextBlock, nazwij ją
Wynik
, następnie z metody wyżej usuń linijkę z MessageBoxem i zamień ją na:Wynik.Text=tekst;
- niestety nie widzimy komunikatu błędu, w tym celu w kodzie XAML po początku znacznika Grid dodaj:
<Grid.Resources>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors).CurrentItem.ErrorContent}" />
</Trigger>
</Style.Triggers>
</Style>
</Grid.Resources>
- niestety tym spobem nie damy rady zablokować ceny by nie była ujemna, więc on jest przydatny do sprawdzenia bezpośrednio typu, usuń kod z poprzedniego podpunktu
- do klasy
Osoba
dopisz przestrzeń nazwusing System.ComponentModel;
. - w klasie
Osoba
dodaj następującą implementację interfejsuIDataErrorInfo
i jego metod:
public string Error
{
get { throw new NotImplementedException(); }
}
public string this[string columnName]
{
get
{
string komunikat = String.Empty;
switch (columnName)
{
case "Imie":
if (string.IsNullOrEmpty(Imie))
komunikat = "Imię musi być wpisane!";
else if (Imie.Length < 3)
komunikat = "Imię musi mieć minimum 3 znaki!";
break;
case "Wiek":
if (Wiek < 0)
komunikat = "Wiek musi być dodatni";
break;
};
return komunikat;
}
}
- w kodzie XAML dodaj między znacznikiem Window a Grid kod:
<Window.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="5"/>
<Setter Property="Width" Value="100"/>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<StackPanel>
<AdornedElementPlaceholder/>
<TextBlock Text="{Binding CurrentItem.ErrorContent}" Foreground="Red"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
- zmodyfikuj dla Texboxów właściwość Text na
{Binding Imie, ValidatesOnDataErrors=True}
i odpowiednie{Binding Wiek, ValidatesOnDataErrors=True}
- jak zabezpieczyć przycisk by nie umożliwiał tworzenia obiektu przy błędnych danych? zmodyfikuj
Button
następująco:
<Button Content="Button" HorizontalAlignment="Left" Margin="219,232,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click" >
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="false" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=ImieT, Path=(Validation.HasError)}" Value="false" />
<Condition Binding="{Binding ElementName=WiekT, Path=(Validation.HasError)}" Value="false" />
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="true" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>