1 按照《prism项目搭建》搭建prism项目
2 新建用户控件库ModuleA,并为其创建Views,ViewModels,Model目录
3 在Model里面新建类
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModuleA.Model
{
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用户控件,在PersonListView定义Region的同时,将RegionContext绑定到ListBox的SelectedItem属性
<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"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="100" />
<RowDefinition />
</Grid.RowDefinitions>
<ListBox x:Name="lstOfPerson" ItemsSource="{Binding LstPerson}"/>
<ContentControl Grid.Row="1" prism:RegionManager.RegionName="DetailRegion"
prism:RegionManager.RegionContext="{Binding SelectedItem, ElementName=lstOfPerson}"/>
</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.Model;
using Prism.Mvvm;
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> _lstPerson = new ObservableCollection<Person>();
public ObservableCollection<Person> LstPerson
{
get { return _lstPerson; }
set { SetProperty(ref _lstPerson, value); }
}
public PersonListViewModel()
{
for (int i = 0; i < 10; i++)
{
_lstPerson.Add(new Person()
{
FirstName = String.Format("First {0}", i),
LastName = String.Format("Last {0}", i),
Age = i
});
}
}
}
}
using ModuleA.Model;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModuleA.ViewModels
{
public class PersonDetailViewModel:BindableBase
{
private Person _selectedPerson = new Person();
public Person SelectedPerson
{
get { return _selectedPerson; }
set { SetProperty(ref _selectedPerson, value); }
}
}
}
7 在ModuleA中新建类ModuleAEntity,并将View注册到对应的Region
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));
regionManager.RegisterViewWithRegion("DetailRegion", typeof(PersonDetailView));
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
}
}
}
8 在App里面添加Module
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule<ModuleAEntity>();
}
9 此时运行发现选定LstBox的项时,DetailView没有变化
10 此时需要修改PersonDetailView代码,监控DataContext的变化
using ModuleA.Model;
using ModuleA.ViewModels;
using Prism.Common;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 ModuleA.Views
{
/// <summary>
/// PersonDetailView.xaml 的交互逻辑
/// </summary>
public partial class PersonDetailView : UserControl
{
public PersonDetailView()
{
InitializeComponent();
RegionContext.GetObservableContext(this).PropertyChanged += PersonDetailView_PropertyChanged;
}
private void PersonDetailView_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
var context = (ObservableObject<object>)sender;
var selectedPerson = (Person)context.Value;
(DataContext as PersonDetailViewModel).SelectedPerson = selectedPerson;
}
}
}
11 运行