Skip to content

Instantly share code, notes, and snippets.

@pjastr
Last active February 4, 2018 20:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save pjastr/8cf21ebd055163231bd60b7276e81bb9 to your computer and use it in GitHub Desktop.
Save pjastr/8cf21ebd055163231bd60b7276e81bb9 to your computer and use it in GitHub Desktop.

Stwórz nowy projekt.

  • dodaj 2 Labele, 2 TextBoxy i Button mniej więcej tak jak na rysunku:

w1

  • grid nazwij jako GridOsoba
  • dla TextBoxów zmień artybut Text na {Binding Imie} i {Binding Wiek} odpowiednio. Nazwij je ImieT i WiekT.
  • 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ń nazw using System.ComponentModel;.
  • w klasie Osoba dodaj następującą implementację interfejsu IDataErrorInfo 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment