WPF Prism
Install-Package Prism.WPF;
Install-Package Prism.DryIOC;
//App.xaml <prism:PrismApplication x:Class="WpfApp37.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApp37" xmlns:prism="http://prismlibrary.com/"> <Application.Resources> </Application.Resources> </prism:PrismApplication> //App.xaml.cs using System.Configuration; using System.Data; using System.Windows; using Prism.DryIoc; using Prism.Ioc; using WpfApp37.ViewModels; using WpfApp37.Views; namespace WpfApp37 { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : PrismApplication { protected override Window CreateShell() { return Container.Resolve<MainWindow>(); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>("ViewA"); containerRegistry.RegisterForNavigation<ViewB, ViewBViewModel>("ViewB"); containerRegistry.RegisterForNavigation<MainWindow, MainWindowViewModel>("MainWindow"); containerRegistry.RegisterDialog<MessageBoxView, MessageBoxViewModel>("MessageBoxView"); } protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings) { base.ConfigureRegionAdapterMappings(regionAdapterMappings); } protected override void OnInitialized() { base.OnInitialized(); var regionManager=Container.Resolve<IRegionManager>(); regionManager.RequestNavigate("MainRegion", "ViewA"); } protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); } } }
//ViewA.xaml <UserControl x:Class="WpfApp37.Views.ViewA" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfApp37.Views" mc:Ignorable="d" xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="True" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > <Grid Margin="20"> <StackPanel> <TextBlock Text="{Binding Message}" FontSize="50" FontWeight="Bold" Foreground="Blue"/> <Button Content="Click Me!" Command="{Binding ClickCommand}" Margin="0,10,0,0" Padding="10"/> <TextBlock Text="{Binding ClickCount}" FontSize="50" Margin="0,10,0,0"/> </StackPanel> </Grid> </UserControl> //ViewA.xaml.cs using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp37.Views { /// <summary> /// Interaction logic for ViewA.xaml /// </summary> public partial class ViewA : UserControl { public ViewA() { InitializeComponent(); } } } //using System; using System.Collections.Generic; using System.Text; namespace WpfApp37.ViewModels { public class ViewAViewModel: ViewModelBase { private int clickCount; public int ClickCount { get { return clickCount; } set { SetProperty(ref clickCount, value); } } private string message = "Welcome to View A!"; public string Message { get { return message; } set { SetProperty(ref message, value); } } public DelegateCommand ClickCommand { get; set; } public ViewAViewModel() { Title="View A"; ClickCommand=new DelegateCommand(ClickCommandExecuted); } private void ClickCommandExecuted() { ClickCount++; Message=$"Button clicked {ClickCount} times"; } } }
//ViewB.xaml <UserControl x:Class="WpfApp37.Views.ViewB" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfApp37.Views" mc:Ignorable="d" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="True"> <Grid Margin="20"> <Grid.RowDefinitions> <RowDefinition Height="60"/> <RowDefinition Height="*"/> <RowDefinition Height="80"/> </Grid.RowDefinitions> <TextBlock Text="View B -Data Display" Grid.Row="0" FontSize="50" FontWeight="Bold"/> <DataGrid Grid.Row="1" ItemsSource="{Binding Items,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False" FontSize="30" Margin="0,10,0,0" VerticalAlignment="Stretch"> <DataGrid.Columns> <DataGridTextColumn Header="Id" Binding="{Binding Id}"/> <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> <DataGridTextColumn Header="ISBN" Binding="{Binding ISBN}"/> <DataGridTextColumn Header="Author" Binding="{Binding Author}"/> </DataGrid.Columns> </DataGrid> <Button Grid.Row="2" FontSize="50" Content="Load Data" Command="{Binding LoadDataCommand}"/> </Grid> </UserControl> //ViewB.xaml.cs using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp37.Views { /// <summary> /// Interaction logic for ViewB.xaml /// </summary> public partial class ViewB : UserControl { public ViewB() { InitializeComponent(); } } } //ViewBViewModel.cs using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Text; using WpfApp37.Models; namespace WpfApp37.ViewModels { public class ViewBViewModel:ViewModelBase { private ObservableCollection<Book> items; public ObservableCollection<Book> Items { get { return items; } set { SetProperty(ref items, value); } } public DelegateCommand LoadDataCommand { get; set; } public ViewBViewModel() { Title="View B"; Items=new ObservableCollection<Book>(); LoadDataCommand=new DelegateCommand(LoadDataCommandExecuted); } private void LoadDataCommandExecuted() { Items.Clear(); for(int i = 1; i<1001; i++) { Items.Add(new Book() { Id=i, Name=$"Name_{i}", ISBN=$"ISBN_{i}_{Guid.NewGuid()}", Author=$"Author_{i}_{Guid.NewGuid()}" }); } } } } //mainView.xaml <Window x:Class="WpfApp37.MainWindow" 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:WpfApp37" mc:Ignorable="d" WindowState="Maximized" Title="{Binding MainTitle}" Height="450" Width="800" xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="True"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="100"/> <RowDefinition Height="100"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--Header--> <StackPanel Grid.Row="0" Orientation="Horizontal" Background="LightBlue"> <TextBlock Text="{Binding Title}" FontSize="50" FontWeight="Bold"/> <TextBlock Text="Prism DryIOC Application" Margin="10,0,0,0"/> </StackPanel> <!--Navigation Menu--> <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="10"> <Button Content="View A" Command="{Binding NavigateCommand}" CommandParameter="ViewA" Margin="5" Padding="10"/> <Button Content="View B" Command="{Binding NavigateCommand}" CommandParameter="ViewB" Margin="5" Padding="10"/> <Button Content="Show Dialog" Command="{Binding ShowDialogCommand}" Margin="5" Padding="10"/> </StackPanel> <!--Content Region--> <!--<Border Grid.Row="2" Margin="10" BorderBrush="DarkGray" BorderThickness="1" Background="LightGray"> --><!-- Remove this background later --><!-- <ContentControl prism:RegionManager.RegionName="MainRegion" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> </Border>--> <ContentControl Grid.Row="2" prism:RegionManager.RegionName="MainRegion" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> </Grid> </Window> //MainViewModel <Window x:Class="WpfApp37.MainWindow" 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:WpfApp37" mc:Ignorable="d" WindowState="Maximized" Title="{Binding MainTitle}" Height="450" Width="800" xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="True"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="100"/> <RowDefinition Height="100"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--Header--> <StackPanel Grid.Row="0" Orientation="Horizontal" Background="LightBlue"> <TextBlock Text="{Binding Title}" FontSize="50" FontWeight="Bold"/> <TextBlock Text="Prism DryIOC Application" Margin="10,0,0,0"/> </StackPanel> <!--Navigation Menu--> <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="10"> <Button Content="View A" Command="{Binding NavigateCommand}" CommandParameter="ViewA" Margin="5" Padding="10"/> <Button Content="View B" Command="{Binding NavigateCommand}" CommandParameter="ViewB" Margin="5" Padding="10"/> <Button Content="Show Dialog" Command="{Binding ShowDialogCommand}" Margin="5" Padding="10"/> </StackPanel> <!--Content Region--> <!--<Border Grid.Row="2" Margin="10" BorderBrush="DarkGray" BorderThickness="1" Background="LightGray"> --><!-- Remove this background later --><!-- <ContentControl prism:RegionManager.RegionName="MainRegion" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> </Border>--> <ContentControl Grid.Row="2" prism:RegionManager.RegionName="MainRegion" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> </Grid> </Window> //ViewModelBase.cs using System; using System.Collections.Generic; using System.Text; using Prism.Mvvm; using Prism.Commands; using System.ComponentModel; using System.Runtime.CompilerServices; namespace WpfApp37.ViewModels { public class ViewModelBase :BindableBase { private string title = "Prism Application"; public string Title { get { return title; } set { SetProperty(ref title, value); } } private bool isBusy; public bool IsBusy { get { return isBusy; } set { SetProperty(ref isBusy, value); } } } } //book.cs using System; using System.Collections.Generic; using System.Text; namespace WpfApp37.Models { public class Book { public int Id { get;set; } public string Name { get;set; } public string ISBN { get;set; } public string Author { get; set; } } }