瀏覽代碼

Добавлена валидация данных

Вадим Королёв 1 年之前
父節點
當前提交
1c1749780e

+ 13 - 0
InvestTracker/Styles/MainStyle.xaml

@@ -13,4 +13,17 @@
     <Style x:Key="NavButton" TargetType="{x:Type Button}">
         <Setter Property="Margin" Value="0,8"/>
     </Style>
+
+    <Style x:Key="ValidationFail" TargetType="{x:Type TextBox}">
+        <Style.Triggers>
+            <Trigger Property="Validation.HasError" Value="True">
+                <Setter Property="Background" Value="Red"/>
+                <Setter Property="BorderThickness" Value="1" />
+                <Setter 
+                    Property="ToolTip"
+                    Value="{Binding RelativeSource={RelativeSource Self},
+                    Path=(Validation.Errors)[0].ErrorContent}"/>
+            </Trigger>
+        </Style.Triggers>
+    </Style>
 </ResourceDictionary>

+ 1 - 0
InvestTracker/VM/EmployeeBrowseVM.cs

@@ -97,6 +97,7 @@ namespace InvestTracker.VM
             }
 
             Employees = new ObservableCollection<Employee>(_dbContext.Employees.ToList());
+            _dbContext.SaveChanges();
 
             GridBlocked = true;
             isDirty = false;

+ 47 - 0
InvestTracker/Validation/Email.cs

@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Controls;
+
+namespace InvestTracker.Validation
+{
+    public class Email : ValidationRule
+    {
+        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
+        {
+            string? email = value.ToString();
+
+            if (email == null)
+            {
+                return new ValidationResult(
+                    false,
+                    "Адрес электронной почты не задан"
+                );
+            }
+
+            // В почте должен быть знак @ и точка после такого знака
+            int dogIndex = email.IndexOf("@");
+            if (dogIndex == -1)
+            {
+                return new ValidationResult(
+                    false,
+                    "Адрес почты обязан содержать символ \"@\""
+                );
+            }
+
+            int dotIndex = email.IndexOf('.', dogIndex);
+            if (dotIndex == -1) 
+            {
+                return new ValidationResult(
+                    false,
+                    "После символа \"@\" должен следовать символ \".\""
+                );
+            }
+
+            return ValidationResult.ValidResult;
+        }
+    }
+}

+ 39 - 2
InvestTracker/Views/EmployeeBrowseView.xaml

@@ -6,6 +6,7 @@
       xmlns:vm="clr-namespace:InvestTracker.VM"
       xmlns:local="clr-namespace:InvestTracker.Views"
       xmlns:model="clr-namespace:InvestTracker.Entities"
+      xmlns:validation="clr-namespace:InvestTracker.Validation"
       mc:Ignorable="d" 
       d:DesignHeight="450" d:DesignWidth="800"
       x:Name="EPage"
@@ -76,6 +77,30 @@
             IsReadOnly="{Binding GridBlocked}"
             SelectedItem="{Binding SelectedEmployee}">
 
+            <!--Рисуем восклицательный знак если в строке ошибка-->
+            <DataGrid.RowValidationErrorTemplate>
+                <ControlTemplate>
+                    <Grid
+                        Margin="0,-2,0,-2"
+                        ToolTip="{Binding
+                            RelativeSource={RelativeSource FindAncestor,
+                            AncestorType={x:Type DataGridRow}},
+                            Path=(Validation.Errors)[0].ErrorContent}">
+                        <Ellipse
+                            StrokeThickness="0"
+                            Fill="Red"
+                            Width="{TemplateBinding FontSize}"
+                            Height="{TemplateBinding FontSize}" />
+                        <TextBlock
+                            Text="!"
+                            FontSize="{TemplateBinding FontSize}"
+                            FontWeight="Bold"
+                            Foreground="White"
+                            HorizontalAlignment="Center" />
+                    </Grid>
+                </ControlTemplate>
+            </DataGrid.RowValidationErrorTemplate>
+
             <DataGrid.Columns>
                 <DataGridTextColumn
                     Binding="{Binding Path=Surname,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
@@ -100,8 +125,20 @@
                     Binding="{Binding Path=Phone,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                     Header="Телефон" />
                 <DataGridTextColumn
-                    Binding="{Binding Path=Email,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
-                    Header="Электронная почта" />
+                    EditingElementStyle="{StaticResource ValidationFail}"
+                    Header="Электронная почта">
+                    <DataGridTextColumn.Binding>
+                        <Binding 
+                            Path="Email" 
+                            Mode="TwoWay" 
+                            UpdateSourceTrigger="PropertyChanged"
+                            ValidatesOnExceptions="True">
+                            <Binding.ValidationRules>
+                                <validation:Email/>
+                            </Binding.ValidationRules>
+                        </Binding>
+                    </DataGridTextColumn.Binding>
+                </DataGridTextColumn>
             </DataGrid.Columns>
         </DataGrid>
     </StackPanel>