1 按照《prism项目搭建》搭建prism项目
2 新建用户控件库项目ModuleA,通过nuget引入prism.unity,新建文件夹Models,Views,ViewModels
3 在Models文件夹新建类Person
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModuleA.Models
{
public class Person : BindableBase
{
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
SetProperty(ref _firstName, value);
}
}
private string _lastName;
public string LastName
{
get { return _lastName; }
set
{
_lastName = value;
SetProperty(ref _lastName, value);
}
}
private int _age;
public int Age
{
get { return _age; }
set
{
_age = value;
SetProperty(ref _age, value);
}
}
public override string ToString()
{
return String.Format("{0}, {1}", LastName, FirstName);
}
}
}
4 在Views目录下新建PersonListView,PersonDetailView,添加Behaviors库的引用,给ListBox添加Interaction.Trigger,调用PersonSelectedCommand,并传递当前选定的Person对象
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
<UserControl x:Class="ModuleA.Views.PersonListView"
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:ModuleA.Views"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding DataContext.SelectedPerson.FirstName}" />
</Style>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="100"/>
<RowDefinition />
</Grid.RowDefinitions>
<ListBox x:Name="lstOfPersons" ItemsSource="{Binding LstPersons}" Margin="10" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<prism:InvokeCommandAction Command="{Binding PersonSelectedCommand}" CommandParameter="{Binding SelectedItem, ElementName=lstOfPersons}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
<TabControl Grid.Row="1" Margin="10" prism:RegionManager.RegionName="PersonDetailsRegion" />
</Grid>
</UserControl>
<UserControl x:Class="ModuleA.Views.PersonDetailView"
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:ModuleA.Views"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- First Name -->
<TextBlock Text="First Name:" Margin="5" />
<TextBlock Grid.Column="1" Margin="5" Text="{Binding SelectedPerson.FirstName}" />
<!-- Last Name -->
<TextBlock Grid.Row="1" Text="Last Name:" Margin="5" />
<TextBlock Grid.Row="1" Grid.Column="1" Margin="5" Text="{Binding SelectedPerson.LastName}" />
<!-- Age -->
<TextBlock Grid.Row="2" Text="Age:" Margin="5"/>
<TextBlock Grid.Row="2" Grid.Column="1" Margin="5" Text="{Binding SelectedPerson.Age}"/>
</Grid>
</UserControl>
5 在ViewModels里面添加PersonListViewModel,PersonDetailViewModel
using ModuleA.Models;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModuleA.ViewModels
{
public class PersonListViewModel:BindableBase
{
private ObservableCollection<Person> _LstPersons = new ObservableCollection<Person>();
public ObservableCollection<Person> LstPersons
{
get { return _LstPersons; }
set { SetProperty(ref _LstPersons, value); }
}
IRegionManager regionManager;
public DelegateCommand<Person> PersonSelectedCommand { get; }
public PersonListViewModel(IRegionManager regionManager)
{
this.regionManager = regionManager;
PersonSelectedCommand = new DelegateCommand<Person>(PersonSelect);
for (int i = 0; i < 10; i++)
{
_LstPersons.Add(new Person()
{
FirstName = String.Format("First {0}", i),
LastName = String.Format("Last {0}", i),
Age = i
});
}
}
private void PersonSelect(Person person)
{
var parameters = new NavigationParameters();
parameters.Add("person", person);
if (person!=null)
{
regionManager.RequestNavigate("PersonDetailsRegion", "PersonDetailView", parameters);
}
}
}
}
using ModuleA.Models;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModuleA.ViewModels
{
public class PersonDetailViewModel:BindableBase, INavigationAware
{
private Person _selectedPerson;
public Person SelectedPerson
{
get { return _selectedPerson; }
set { SetProperty(ref _selectedPerson, value); }
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
var person = navigationContext.Parameters["person"] as Person;
if (person != null)
return SelectedPerson != null && SelectedPerson.LastName == person.LastName;
else
return true;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
var person = navigationContext.Parameters["person"] as Person;
if (person != null)
SelectedPerson = person;
}
}
}
6 在ModuleA中新建ModuleAEntity类,在其中注册导航视图
using ModuleA.Views;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModuleA
{
public class ModuleAEntity : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
var regionManager = containerProvider.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("ContentRegion", typeof(PersonListView));
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<PersonDetailView>();
}
}
}
7 在App里面配置ModuleA
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule<ModuleAEntity>();
}
8 运行