Разработка приложений на базе WPF и Silverlight

Коды и XAML описания документов

Показывать лекцию целиком

Код главной страницы класса SilverlightAppPersonal.MainPage

<UserControl x:Class="SilverlightAppPersonal.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="600" d:DesignWidth="800"
    xmlns:controls="clr-namespace: 
                    System.Windows.Controls;assembly=System.Windows.Controls">
    <Grid x:Name="LayoutRoot" Background="White" Margin="10" VerticalAlignment="Top"
                                                            Height="590" Width="779" 
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="384"/>
            <ColumnDefinition Width="166*" />
            <ColumnDefinition Width="229*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="30" />
            <RowDefinition Height="249*" />
            <RowDefinition Height="50" />
        </Grid.RowDefinitions>
        <TextBlock Name="PersonList" Margin="5,5,145,5" Text="Список сотрудников" 
        Foreground="#FF000085" FontStyle="Italic" FontSize="12" Grid.ColumnSpan="2" />
       <TextBlock Name="EmployeeDefinition" Margin="5" Text="Данные по сотруднику"  
      Foreground="#FF000085" FontStyle="Italic" FontSize="12" Grid.Column="2" 
                                                              TextAlignment="Center" />
        <StackPanel Name="EmployeeAttributeLable" Orientation="Vertical" Grid.Row="1" 
                                                    Grid.Column="1" Margin="9,7,6,0">
              <TextBlock Name="TextBlockLastName" Text="Фамилия" Height="25" 
                              TextAlignment="Right" TextWrapping="NoWrap"></TextBlock>
            <TextBlock Name="TextBlockFirstName" Text="Имя" Margin="2" Height="25" 
                            TextAlignment="Right" VerticalAlignment="Center"></TextBlock>
            <TextBlock Name="TextBlockSecondtName" Text="Отчество" Margin="2" 
                Height="25" TextAlignment="Right" VerticalAlignment="Center"></TextBlock>
            <TextBlock Name="TextBlockNetName" Text="Сетевое имя" Margin="2" 
                                           Height="25" TextAlignment="Right"></TextBlock>
            <TextBlock Name="TextBlockJodTitle" Text="Должность" Margin="2" 
                                          Height="25" TextAlignment="Right"></TextBlock>
            <TextBlock Name="TextBlockStatus" Text="Статус" Margin="2" Height="25" 
                                                     TextAlignment="Right"></TextBlock>
            <TextBlock Name="TextBlockAccess" Text="Уроветь доступа" Margin="2" 
                                         Height="25" TextAlignment="Right"></TextBlock>
            <TextBlock Name="TextBlockFirstDate" Text="Дата назначения" Margin="2" 
                                         Height="25" TextAlignment="Right"></TextBlock>
            <TextBlock Name="TextBlockLastDate" Text="Дата увольнения" Margin="2" 
                                          Height="25" TextAlignment="Right"></TextBlock>
        <StackPanel Name="EmployeeAttributeValue" Orientation="Vertical" Grid.Row="1" 
                                                               Grid.Column="2" >
            <TextBox Name="LastName" Height="25" Margin="2" ></TextBox>
            <TextBox Name="FirstName" Height="25" Margin="2"></TextBox>
            <TextBox Name="SecondtName" Height="25" Margin="2"></TextBox>
            <TextBox Name="NetName" Height="25" Margin="2"></TextBox>
            <ComboBox Height="25" Name="comboBoxTitle" Margin="2" />
            <ComboBox Name="comboBoxStatus" Height="25" Margin="2" />
            <ComboBox Height="25" Name="comboBoxAccess" Margin="2" />
            <controls:DatePicker Name="datePickerFirstDate" Margin="2"/>
            <controls:DatePicker Name="datePickerLastDate" Margin="2" />
        </StackPanel>
        <StackPanel Orientation="Horizontal" Grid.Row="2" Margin="0,0,17,0">
            <Button Name="ButtonSave" Content="Сохранить" Margin="5" Padding="5"
                                                        Height="25" IsEnabled="False" />
            <Button Name="ButtonUndo" Content="Отменить" Margin="5" Padding="5" 
                                                        Height="25" IsEnabled="False" />
            <Button Name="ButtonNew" Content="Создать" Margin="5" Padding="5" 
                                                       Height="25" IsEnabled="False" />
            <Button Content="Загрузить" Height="25" Name="ButtonOpen" Margin="5" 
                                                Padding="10,5,10,5" IsEnabled="False" />
        </StackPanel>
        <StackPanel Orientation="Horizontal" Grid.Row="2" Grid.Column="2">
            <Button Name="ButtonEdit"  Content="Редактировать" Margin="5" 
                                   Padding="10,5,10,5" Height="25" IsEnabled="False" />
            <Button Name="ButtonDelete"  Content="Удалить" Padding="10,5,10,5" 
                                                  Margin="35,0,0,0" Height="25" />
        </StackPanel>
        <ListBox Grid.Row="1" Name="listBoxEmployees" 
             HorizontalAlignment="Center"  
             Margin="5,2,15,9" Padding="3" Width="364" >
            <ListBox.ItemTemplate>
                 <DataTemplate>
                      <StackPanel Orientation="Horizontal">
                      <TextBlock Text="{Binding Path=EmployeeSurname}" />
                      <TextBlock Text="  " />
                      <TextBlock Text="{Binding Path=EmployeeName}" />
                      <TextBlock Text="  " />
                      <TextBlock Text="{Binding Path=EmployeePatronymic}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
     </ListBox>
    </Grid>
</UserControl>

Файл ColorsAndBrushesRD.xaml

<ResourceDictionary
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!--Цвет выделения внешней рамки элемента списка при наведении мыши-->
    <Color  x:Key="PhotoSelectedBGColor">#FF768EE4</Color>
    <!--Цвет выделения внешней рамки элемента списка-->
    <Color x:Key="ItemSelectedBGColor">#FF91D0DA</Color>
    <!--Цвет фона кнопки-->
    <Color x:Key="ButtoColor">#FFBDDBE2</Color>
    <!--Цвет рамки кнопки-->
    <Color x:Key="ButtoBorder">#FF313491</Color>
    <!--Цвет рамки кнопки при наведении мыши-->
    <Color x:Key="ButtoBorderMouseOver">#FFFF7D00</Color>
    <!--Кисть заливки внутренней рамки пункта ListBox-->
    <SolidColorBrush
		x:Key="PhotoBorderSolidBrush"
		Color="#FF346797" />
    <!--Кисть заливки фона пункта списка ListBox-->
    <SolidColorBrush
		x:Key="PhotoBGSolidBrush"
		Color="#FFFFFFFF" />
    <!--Кисть заливки внешней рамки выделенного пункта списка ListBox-->
    <SolidColorBrush
		x:Key="PhotoSelectedBGSolidBrush"
		Color="{StaticResource PhotoSelectedBGColor}"/>
    <!--Кисть заливки внешней рамки невыделенного пункта списка ListBox-->
    <SolidColorBrush 
		x:Key="ListBoxItemPhotoActiveBGSolidBrush" 
		Color="#00FFFFFF"/>
</ResourceDictionary>

XAML-разметка стиля ListBoxItemStyle

Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem">
  <Setter Property="Padding" Value="1"/>
  <Setter Property="VerticalAlignment" Value="Top"/>
  <Setter Property="HorizontalAlignment" Value="Left"/>
  <Setter Property="Template">
    <Setter.Value>
    <ControlTemplate TargetType="ListBoxItem">
       <Border
             Name="Border" Padding="5"
		Width="200" Height="126"
		CornerRadius="5"
              Background="{StaticResource ListBoxItemPhotoActiveBGSolidBrush}">
                <VisualStateManager.VisualStateGroups>
                  <VisualStateGroup x:Name="CommonStates">
                    <VisualState x:Name="Normal" />
                    <VisualState x:Name="MouseOver">
                       <Storyboard>
                         <ColorAnimation  Duration="0:0:0"
			     To="{StaticResource PhotoSelectedBGColor}"
	  		      Storyboard.TargetProperty=
                             "(Border.Background).(SolidColorBrush.Color)" 
			      Storyboard.TargetName="Border" />
                        </Storyboard>
                      </VisualState>
                    </VisualStateGroup>
                       <VisualStateGroup x:Name="SelectionStates">
                         <VisualState x:Name="Selected">
                            <Storyboard>
                               <ColorAnimation Duration="0:0:0"
                                  To="{StaticResource ItemSelectedBGColor}"
 Storyboard.TargetProperty= 
(Border.Background).(SolidColorBrush.Color)" 
					Storyboard.TargetName="Border" />
                             </Storyboard>
                            </VisualState>
                          <VisualState x:Name="Unselected" />
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border 
			   BorderBrush="{StaticResource PhotoSelectedBGSolidBrush}"
			   BorderThickness="1"
			   CornerRadius="5">
                       <ContentPresenter x:Name="contentPresenter" />
                    </Border>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

XAML-разметка стиля ListBoxPhotoStyle

<Style x:Key="ListBoxPhotoStyle" TargetType="ListBox">
  <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
  <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
  <Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="ListBox">
            <Border> 
               <ScrollViewer x:Name="ScrollViewer"
			  Style="{StaticResource ScrollViewerPhotoStyle}">
                   <ItemsPresenter/>
               </ScrollViewer>
               </Border>
        </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

XAML-разметка стиля ScrollViewerPhotoStyle

<Style x:Key="ScrollViewerPhotoStyle" TargetType="ScrollViewer">
    <Setter Property="HorizontalScrollBarVisibility" Value="Auto"/>
    <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ScrollViewer">
                <Grid>
                    <ScrollContentPresenter 
		x:Name="ScrollContentPresenter" 
		Cursor="{TemplateBinding Cursor}" 
		ContentTemplate="{TemplateBinding ContentTemplate}" 
		Grid.Column="1" Grid.Row="1"/>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <ScrollBar 
		x:Name="VerticalScrollBar" 
		Grid.Row="0" Grid.Column="1" 
		IsTabStop="False" 
		Maximum="{TemplateBinding ScrollableHeight}" 
		Height="250" Minimum="0" 
		Orientation="Vertical" 
		VerticalAlignment="Center"
		Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" 
                            Value="{TemplateBinding VerticalOffset}" 
                            ViewportSize="{TemplateBinding ViewportHeight}" 
                            Width="18" Margin="10" HorizontalAlignment="Center"
 Opacity="0.5"/>
                    </Grid>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Шаблон данных ListBoxItemPhotoDataTemplate

<DataTemplate x:Key="ListBoxItemPhotoDataTemplate">
    <Border
	Padding="10"
	Background="{StaticResource PhotoBGSolidBrush}" 
	CornerRadius="5">
        <Border
		BorderBrush="{StaticResource PhotoBorderSolidBrush}"
		BorderThickness="1">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Image Grid.Column="0" Source="{Binding Path=Picture, Mode=OneWay, 
                    Converter={StaticResource ImageConverter}}" 
                       Height="87" Width="60" Margin="5" 
                       Name="Image" Stretch="Uniform"   />
                <StackPanel  Grid.Column="1" Orientation="Vertical">
                    <TextBlock Text="{Binding Path=EmployeeSurname}" Margin="5,5,5,5" />
                    <TextBlock Text="{Binding Path=EmployeeName}" Margin="5" />
                    <TextBlock Text="{Binding Path=EmployeePatronymic}" Margin="5" />
                </StackPanel>
            </Grid>
        </Border>
    </Border>
</DataTemplate>

XAML-разметка стиля ButtonStyle

<Style x:Key="ButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="#FF1F3B53"/>
    <Setter Property="Foreground" Value="#FF000000"/>
    <Setter Property="Padding" Value="3"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="BorderBrush">
        <Setter.Value>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FFA3AEB9" Offset="0"/>
                <GradientStop Color="#FF8399A9" Offset="0.375"/>
                <GradientStop Color="#FF718597" Offset="0.375"/>
                <GradientStop Color="#FF617584" Offset="1"/>
            </LinearGradientBrush>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
                 <!—Определение вложенного свойства ControlTemplate -->
        </Setter.Value>
    </Setter>
</Style>

Шаблон ControlTemplate для Button

<ControlTemplate TargetType="Button">
    <Grid 
        Cursor="Hand">
        <VisualStateManager.VisualStateGroups>
        <!—Описание состояний и поведения в этих состояниях -->
        </VisualStateManager.VisualStateGroups>
        <Border x:Name="Background" CornerRadius="3" Background="White" 
             BorderThickness="{TemplateBinding BorderThickness}" 
             BorderBrush="{TemplateBinding BorderBrush}">
            <Grid Background="{TemplateBinding Background}"  Margin="1">
                <Border x:Name="BackgroundAnimation" Opacity="0" Background="#FF448DCA" />
                <Rectangle x:Name="BackgroundGradient" >
                  <Rectangle.Fill>
                     <LinearGradientBrush StartPoint=".7,0" EndPoint=".7,1">
                        <GradientStop Color="#FFFFFFFF" Offset="0" />
                        <GradientStop Color="#F9FFFFFF" Offset="0.375" />
                        <GradientStop Color="#E5FFFFFF" Offset="0.625" />
                        <GradientStop Color="#C6FFFFFF" Offset="1" />
                      </LinearGradientBrush>
                   </Rectangle.Fill>
               </Rectangle>
            </Grid>
        </Border>
        <ContentPresenter
              x:Name="contentPresenter"
              Content="{TemplateBinding Content}"
              ContentTemplate="{TemplateBinding ContentTemplate}"
              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
              Margin="{TemplateBinding Padding}"/>
        <Rectangle x:Name="DisabledVisualElement" RadiusX="3" RadiusY="3"
                 Fill="#FF95A0A3" Opacity="0" IsHitTestVisible="false" />
        <Rectangle x:Name="FocusVisualElement" RadiusX="2" RadiusY="2"  Margin="1" 
                               Stroke="#FF6DBDD1" StrokeThickness="1" Opacity="0" 
					IsHitTestVisible="false" />
        <Rectangle x:Name="MouseOverVisualElement" RadiusX="3" RadiusY="3" 
Margin="1" Stroke="#FF346797" StrokeThickness="1" Opacity="1" IsHitTestVisible="false" />
     </Grid>
</ControlTemplate>

XAML-разметка стиля ButtonStyle

<Style x:Key="ButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="#FF1F3B53"/>
    <Setter Property="Foreground" Value="#FF000000"/>
    <Setter Property="Padding" Value="3"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="BorderBrush">
        <Setter.Value>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FFA3AEB9" Offset="0"/>
                <GradientStop Color="#FF8399A9" Offset="0.375"/>
                <GradientStop Color="#FF718597" Offset="0.375"/>
                <GradientStop Color="#FF617584" Offset="1"/>
            </LinearGradientBrush>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid 
                    Cursor="Hand">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal"/>
                            <!--Изменение цвета рамки (бордюра) кнопки-->
                            <VisualState x:Name="MouseOver">
                                <Storyboard>
                                    <DoubleAnimation Duration="0" 
                                      Storyboard.TargetName="BackgroundAnimation" 
                                      Storyboard.TargetProperty="Opacity" To="1"/>
                                     <!--Изменение цвета рамки (бордюра) кнопки-->
                                    <ColorAnimation Duration="0" 
                                     Storyboard.TargetName="Background" 
                                     Storyboard.TargetProperty=
                                    "(Border.Background).(SolidColorBrush.Color)" 
                                     To="#FF346797"/>
                                     <ColorAnimation Duration="0"
                                      Storyboard.TargetName="BackgroundGradient"
                                      Storyboard.TargetProperty=
"(Rectangle.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" 
                                      To="#F2FFFFFF"/>
                                      <ColorAnimation Duration="0" 
                                        Storyboard.TargetName="BackgroundGradient" 
                                        Storyboard.TargetProperty=
"(Rectangle.Fill).(GradientBrush.GradientStops)[2].(GradientStop.Color)" 
                                        To="#CCFFFFFF"/>
                                       <ColorAnimation Duration="0" 
                                         Storyboard.TargetName="BackgroundGradient" 
                                         Storyboard.TargetProperty=
"(Rectangle.Fill).(GradientBrush.GradientStops)[3].(GradientStop.Color)" 
                                         To="#7FFFFFFF"/>
                                        <!--Изменение толщины рамки кнопки-->
                                       <DoubleAnimation Duration="0"
                                          Storyboard.TargetName="MouseOverVisualElement" 
                                          Storyboard.TargetProperty="StrokeThickness"
                                          To="3"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <ColorAnimation Duration="0" 
                                            Storyboard.TargetName="Background" 
                                            Storyboard.TargetProperty=
                                            "(Border.Background).(SolidColorBrush.Color)"
                                            To="#FF6DBDD1"/>
                                        <DoubleAnimation Duration="0" 
                                           Storyboard.TargetName="BackgroundAnimation" 
                                           Storyboard.TargetProperty="Opacity" 
                                           To="1"/>
                                        <ColorAnimation Duration="0" 
                                           Storyboard.TargetName="BackgroundGradient" 
                                           Storyboard.TargetProperty=
"(Rectangle.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)" 
                                           To="#D8FFFFFF"/>
                                        <ColorAnimation Duration="0" 
                                           Storyboard.TargetName="BackgroundGradient" 
                                           Storyboard.TargetProperty=
"(Rectangle.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" 
                                           To="#C6FFFFFF"/>
                                        <ColorAnimation Duration="0"
                                            Storyboard.TargetName="BackgroundGradient" 
                                            Storyboard.TargetProperty=
"(Rectangle.Fill).(GradientBrush.GradientStops)[2].(GradientStop.Color)" 
                                            To="#8CFFFFFF"/>
                                        <ColorAnimation Duration="0"
                                            Storyboard.TargetName="BackgroundGradient" 
                                            Storyboard.TargetProperty=
"(Rectangle.Fill).(GradientBrush.GradientStops)[3].(GradientStop.Color)" 
                                            To="#3FFFFFFF"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Disabled">
                                    <Storyboard>
                                       <DoubleAnimation Duration="0" 
                                          Storyboard.TargetName="DisabledVisualElement" 
                                          Storyboard.TargetProperty="Opacity" To=".55"/>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="FocusStates">
                                <VisualState x:Name="Focused">
                                    <Storyboard>
                                        <DoubleAnimation Duration="0" 
                                            Storyboard.TargetName="FocusVisualElement" 
                                            Storyboard.TargetProperty="Opacity" 
                                            To="1"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Unfocused" />
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Border x:Name="Background" CornerRadius="3" Background="White" 
                                BorderThickness="{TemplateBinding BorderThickness}" 
                                BorderBrush="{TemplateBinding BorderBrush}">
                            <Grid Background="{TemplateBinding Background}"  Margin="1">
                                <Border Opacity="0" x:Name="BackgroundAnimation"
                                                               Background="#FF448DCA" />
                                <Rectangle x:Name="BackgroundGradient" >
                                  <Rectangle.Fill>
                                     <LinearGradientBrush StartPoint=".7,0"
                                                                   EndPoint=".7, 1">
                                        <GradientStop Color="#FFFFFFFF" Offset="0" />
                                        <GradientStop Color="#F9FFFFFF" Offset="0.375" />
                                        <GradientStop Color="#E5FFFFFF" Offset="0.625" />
                                        <GradientStop Color="#C6FFFFFF" Offset="1" />
                                      </LinearGradientBrush>
                                   </Rectangle.Fill>
                               </Rectangle>
                            </Grid>
                        </Border>
                        <ContentPresenter
                              x:Name="contentPresenter"
                              Content="{TemplateBinding Content}"
                              ContentTemplate="{TemplateBinding ContentTemplate}"
                              VerticalAlignment=
                                     "{TemplateBinding VerticalContentAlignment}"
                              HorizontalAlignment=
                                      "{TemplateBinding HorizontalContentAlignment}"
                              Margin="{TemplateBinding Padding}"/>
                        <Rectangle x:Name="DisabledVisualElement" RadiusX="3" RadiusY="3"
                                 Fill="#FF95A0A3" Opacity="0" IsHitTestVisible="false" />
                        <Rectangle x:Name="FocusVisualElement" RadiusX="2" RadiusY="2" 
                                     Margin="1" Stroke="#FF6DBDD1" StrokeThickness="1"
                                     Opacity="0" IsHitTestVisible="false" />
                        <Rectangle x:Name="MouseOverVisualElement" RadiusX="3" 
                                     RadiusY="3" Margin="1" Stroke="#FF346797" 
                              StrokeThickness="1" Opacity="1" IsHitTestVisible="false" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Код класса EmployeeDomainService

[EnableClientAccess()]
public class EmployeeDomainService: LinqToEntitiesDomainService<PersonalEnterpriceEntities>
{
    public IQueryable<Employee> GetEmployees()
    {
        return this.ObjectContext.Employees;
    }
    public void InsertEmployee(Employee employee)
    {
        if ((employee.EntityState != EntityState.Detached))
        {
            this.ObjectContext.ObjectStateManager.ChangeObjectState(employee,
 EntityState.Added);
        }
        else
        {
            this.ObjectContext.Employees.AddObject(employee);
        }
    }
    public void UpdateEmployee(Employee currentEmployee)
    {
        this.ObjectContext.Employees.AttachAsModified(currentEmployee,
 this.ChangeSet.GetOriginal(currentEmployee));
    }
    public void DeleteEmployee(Employee employee)
    {
        if ((employee.EntityState == EntityState.Detached))
        {
            this.ObjectContext.Employees.Attach(employee);
        }
        this.ObjectContext.Employees.DeleteObject(employee);
    }
    public IQueryable<Title> GetTitles()
    {
        return this.ObjectContext.Titles;
    }
    public void InsertTitle(Title title)
    {
        if ((title.EntityState != EntityState.Detached))
        {
            this.ObjectContext.ObjectStateManager.ChangeObjectState(title,
 EntityState.Added);
        }
        else
        {
            this.ObjectContext.Titles.AddObject(title);
        }
    }
        public void UpdateTitle(Title currentTitle)
        {
            this.ObjectContext.Titles.AttachAsModified(currentTitle,
 this.ChangeSet.GetOriginal(currentTitle));
        }
        public void DeleteTitle(Title title)
        {
            if ((title.EntityState == EntityState.Detached))
            {
                this.ObjectContext.Titles.Attach(title);
            }
            this.ObjectContext.Titles.DeleteObject(title);
        }
    }
}

Код класса EmployeeMetadata

[MetadataTypeAttribute(typeof(Employee.EmployeeMetadata))]
public partial class Employee
{
    internal sealed class EmployeeMetadata
    {
        private EmployeeMetadata()
        {  }
        public string Email { get; set; }
        public Nullable<DateTime> FirstDate { get; set; }
        public string FirstName { get; set; }
        public short ID { get; set; }
        public string Inn { get; set; }
        public Nullable<DateTime> LastDate { get; set; }
        public string LastName { get; set; }
        public string Phone { get; set; }
        public byte[] Picture { get; set; }
        public string Role { get; set; }
        public string SecondName { get; set; }
        public Title Title { get; set; }
        public short TitleID { get; set; }
    }
}
[MetadataTypeAttribute(typeof(Title.TitleMetadata))]
public partial class Title
{
    internal sealed class TitleMetadata
    {
        private TitleMetadata()
        {
        }
        public EntityCollection<Employee> Employees { get; set; }
        public short ID { get; set; }
        public string Title1 { get; set; }
    }
}

Код модифицированного класса EmployeeMetadata

internal sealed class EmployeeMetadata
{
    private EmployeeMetadata()
    {      }
    [Display(Name = "Эл. почта", Order = 7)]
    public string Email { get; set; }
    [Display(Name = "Дата приема", Order = 9)]
    public Nullable<DateTime> FirstDate { get; set; }
    [Display(Name = "Имя", Order = 2)]
    public string FirstName { get; set; }
    public short ID { get; set; }
    [Display(Name = "ИНН", Order = 6)]
    public string Inn { get; set; }
    [Display(Name = "Дата увольнения", Order = 10)]
    public Nullable<DateTime> LastDate { get; set; }
     [Display(Name = "Фамилия", Order = 1)]
    public string LastName { get; set; }
    [Display(Name = "Телефон", Order = 8)]
    public string Phone { get; set; }
    [Display(Name = "Фото", Order = 0)]
    public byte[] Picture { get; set; }
    [Display(Name = "Роль", Order = 5)]
    public string Role { get; set; }
     [Display(Name = "Отчество", Order = 3)]
    public string SecondName { get; set; }
    [Display(Name = "Должность", Order = 4)]
    [Include]
    EntityCollection<Title> Title { get; set; }
    public short TitleID { get; set; }
}

XAML-описание сетки gridSearch фрагмента страницы EmployeePage

<Border x:Name="borderSearch" Grid.Row="0" Grid.Column="1" 
	CornerRadius="10" Margin="5" Background="#FFF2F2F2" BorderThickness="1">
	<Grid x:Name="gridSearch" >
		<Grid.ColumnDefinitions>
			<ColumnDefinition Width="Auto" />
			<ColumnDefinition Width="Auto"/>
		</Grid.ColumnDefinitions>
		<Grid.RowDefinitions >
			<RowDefinition Height="30" />
			<RowDefinition Height="30"/>
			<RowDefinition Height="30"/>
		</Grid.RowDefinitions>
	<TextBlock Grid.Column="0" Grid.ColumnSpan="2" Text="Поиск" 
		Margin="2" HorizontalAlignment="Center"/>
	<TextBlock Grid.Row="1" Text="По фамилии" 
		HorizontalAlignment="Right" Margin="10,2,10,2" VerticalAlignment="Center"/>
	<TextBlock Grid.Row="2" Text="По должности" HorizontalAlignment="Right"
 		Margin="10,2,10,2" VerticalAlignment="Center"/>
	<TextBox x:Name="textBoxLastName" Grid.Column="1" Grid.Row="1" Height="23" 
		HorizontalAlignment="Left" Margin="20,2,20,0" 
		VerticalAlignment="Top" Width="300" 
		TextChanged ="textBoxLastName_TextChanged" />
	<input:AutoCompleteBox Grid.Row="2" Grid.Column="1" Name="FilterText"
		HorizontalAlignment="Left"
		ValueMemberBinding="{Binding Title}" 
		ItemsSource="{Binding ElementName=titleEmployeeDomainDataSource,
				Path=Data}"
		TextChanged ="FilterText_TextChanged"
		Margin="20,2,20,2" Height="23" Width="300"/> 
	</Grid>
</Border>

Код класса EmployeeMetadata с атрибутами для валидации

internal sealed class EmployeeMetadata
        {
            private EmployeeMetadata()
            { }
            [Display(Name = "Эл. почта", Order = 7)]
            [RegularExpression("^([\\w-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|" + 
" (([\\w-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$", 
ErrorMessageResourceName = "ValidationErrorInvalidEmail", 
ErrorMessageResourceType = typeof(ValidationErrorResources))]
            public string Email { get; set; }
            [Display(Name = "Дата приема", Order = 9)]
            public Nullable<DateTime> FirstDate { get; set; }
            [Display(Name = "Имя", Order = 2)]
            [RegularExpression((@"^[А-Яа-я' ''-']{1,20}$"), 
ErrorMessage = "Недопустимые символы или более 20 символов")]
            [Required(ErrorMessage = "Поле обязательно должно быть заполнено")]
            public string FirstName { get; set; }
            [Editable(false)]
            public short ID { get; set; }
            [Display(Name = "ИНН", Order = 6)]
            [RegularExpression((@"^[0-9]{1,12}$"), 
ErrorMessage = "Допустимы толька цифровые символы, 
длина ИНН - 12 символов")]
            [CustomValidation(typeof(ValidaterInn), "ValidateInn")]
            public string Inn { get; set; }
            [Display(Name = "Дата увольнения", Order = 10)]
            public Nullable<DateTime> LastDate { get; set; }
            [Display(Name = "Фамилия", Order = 1)]
            [Required(ErrorMessage = "Поле обязательно должно быть заполнено")]
            [RegularExpression((@"^[А-Яа-я' ''-']{1,20}$"), 
ErrorMessage = "Недопустимые символы или более 20 символов")]
            public string LastName { get; set; }
            [Display(Name = "Телефон", Order = 8)]
            public string Phone { get; set; }
            [Display(Name = "Фото", Order = 0)]
            public byte[] Picture { get; set; }
            [Display(Name = "Роль", Order = 5)]
            [RegularExpression((@"^[А-Яа-я' ''-']{1,20}$"), 
ErrorMessage = "Недопустимые символы или более 20 символов")]
            public string Role { get; set; }
            [Display(Name = "Отчество", Order = 3)]
            [RegularExpression((@"^[А-Яа-я' ''-']{1,20}$"), 
ErrorMessage = "Недопустимые символы или более 20 символов")]
            [Required(ErrorMessage = "Поле обязательно должно быть заполнено")]
            public string SecondName { get; set; }
            [Include]
            [Display(Name = "Должность", Order = 4)]
            public EntityCollection<Title> Title { get; set; }
            public short TitleID { get; set; }
        }
Вернуться к учебному плану