Showing posts with label WPF MVVM design pattern. Show all posts
Showing posts with label WPF MVVM design pattern. Show all posts

Friday, 21 October 2016

WPF MVVM design pattern Example

WPF MVVM design pattern Example:

Create Student class in Model Folder:
public class StudentModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Class { get; set; }
    }

Create ViewModel StudentViewModel in ViewModel Folder
public class StudentViewModel:INotifyPropertyChanged
    {
        public StudentViewModel()
        {
            PageName = "WPF Demo- MVVM";
        }
              
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        private string pageName;
        public string PageName
        {
            get { return pageName; }
            set { pageName = value; OnPropertyChanged("PageName"); }
        }

        private ObservableCollection<StudentModel> students;

        public ObservableCollection<StudentModel> Students
        {
            get { if (students == null) GetStudentData(); return students; }
            set { students = value; OnPropertyChanged("Students"); }
        }

        private void GetStudentData()
        {
            students = new ObservableCollection<StudentModel>
            {// Here we call APi data or Database Data
                new StudentModel {Id=1, Name="XYZ", Class="1st" },
                new StudentModel {Id=2, Name="XYZ123", Class="2nd" },
                new StudentModel {Id=3, Name="XYZ1234", Class="1st" },
                new StudentModel {Id=4, Name="XYZ123455", Class="2nd" }
            };
        }
       
    }
 Add StudentView page into the view folder
Now Add View Model in XAMl File

    <!--ViewMOdel Binding-->   
    <Window.DataContext>
        <VM:StudentViewModel/>
    </Window.DataContext>
<Window x:Class="Wpf2.View.StudentView"
        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"
        xmlns:local="clr-namespace:Wpf2.View"
        xmlns:VM="clr-namespace:Wpf2.ViewModel"
        mc:Ignorable="d"
        Title="StudentView" Height="300" Width="300">
    <!--Namespace call of viewModel, VM is custom name -->

    <!--ViewMOdel Binding-->   
    <Window.DataContext>
        <VM:StudentViewModel/>
    </Window.DataContext>

    <Window.Resources>
        <!--Use in ListView-->
        <!--Also create User control with Dependancy property if data is more complex or resuse, style-->
        <DataTemplate x:Key="KeyStudentRecordDataTemplate">
            <Grid Background="#FFFAFFD7">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="2*"/>
                    <ColumnDefinition Width="2*"/>
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding Name}"/> <!--Default Zero index-->
                <TextBlock Grid.Column="1" Text="{Binding Class}"/>
            </Grid>
        </DataTemplate>
    </Window.Resources>
   
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Grid Grid.Row="0" Background="Gray">
            <TextBlock Text="{Binding PageName}" TextAlignment="Center" Style="{StaticResource KeyTextBlockStyle}"/> <!-- App.xaml->KeyTextBlockStyle-->
        </Grid>

        <ListView Grid.Row="1" ItemsSource="{Binding Students}" ItemTemplate="{StaticResource KeyStudentRecordDataTemplate}" HorizontalContentAlignment="Stretch"/>

    </Grid>

</Window>

Add Resource Style in App.xaml file
<Application.Resources>
        <Style x:Key="KeyTextBlockStyle" TargetType="TextBlock">
            <Setter Property="FontSize" Value="30"/>
            <Setter Property="Background" Value="Gray"/>
            <Setter Property="Foreground" Value="White"/>
        </Style>
    </Application.Resources>

OUtput

Happy Coding ..

Thanks



WPF MVVM design pattern Example

WPF MVVM design pattern Example:

Create Student class in Model Folder:
public class StudentModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Class { get; set; }
    }

Create ViewModel StudentViewModel in ViewModel Folder
public class StudentViewModel:INotifyPropertyChanged
    {
        public StudentViewModel()
        {
            PageName = "WPF Demo- MVVM";
        }
              
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        private string pageName;
        public string PageName
        {
            get { return pageName; }
            set { pageName = value; OnPropertyChanged("PageName"); }
        }

        private ObservableCollection<StudentModel> students;

        public ObservableCollection<StudentModel> Students
        {
            get { if (students == null) GetStudentData(); return students; }
            set { students = value; OnPropertyChanged("Students"); }
        }

        private void GetStudentData()
        {
            students = new ObservableCollection<StudentModel>
            {// Here we call APi data or Database Data
                new StudentModel {Id=1, Name="XYZ", Class="1st" },
                new StudentModel {Id=2, Name="XYZ123", Class="2nd" },
                new StudentModel {Id=3, Name="XYZ1234", Class="1st" },
                new StudentModel {Id=4, Name="XYZ123455", Class="2nd" }
            };
        }
       
    }
 Add StudentView page into the view folder
Now Add View Model in XAMl File

    <!--ViewMOdel Binding-->   
    <Window.DataContext>
        <VM:StudentViewModel/>
    </Window.DataContext>
<Window x:Class="Wpf2.View.StudentView"
        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"
        xmlns:local="clr-namespace:Wpf2.View"
        xmlns:VM="clr-namespace:Wpf2.ViewModel"
        mc:Ignorable="d"
        Title="StudentView" Height="300" Width="300">
    <!--Namespace call of viewModel, VM is custom name -->

    <!--ViewMOdel Binding-->   
    <Window.DataContext>
        <VM:StudentViewModel/>
    </Window.DataContext>

    <Window.Resources>
        <!--Use in ListView-->
        <!--Also create User control with Dependancy property if data is more complex or resuse, style-->
        <DataTemplate x:Key="KeyStudentRecordDataTemplate">
            <Grid Background="#FFFAFFD7">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="2*"/>
                    <ColumnDefinition Width="2*"/>
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding Name}"/> <!--Default Zero index-->
                <TextBlock Grid.Column="1" Text="{Binding Class}"/>
            </Grid>
        </DataTemplate>
    </Window.Resources>
   
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Grid Grid.Row="0" Background="Gray">
            <TextBlock Text="{Binding PageName}" TextAlignment="Center" Style="{StaticResource KeyTextBlockStyle}"/> <!-- App.xaml->KeyTextBlockStyle-->
        </Grid>

        <ListView Grid.Row="1" ItemsSource="{Binding Students}" ItemTemplate="{StaticResource KeyStudentRecordDataTemplate}" HorizontalContentAlignment="Stretch"/>

    </Grid>

</Window>

Add Resource Style in App.xaml file
<Application.Resources>
        <Style x:Key="KeyTextBlockStyle" TargetType="TextBlock">
            <Setter Property="FontSize" Value="30"/>
            <Setter Property="Background" Value="Gray"/>
            <Setter Property="Foreground" Value="White"/>
        </Style>
    </Application.Resources>

OUtput

Happy Coding ..

Thanks