1 根据《prism basic navigation》创建项目和模块
2 在ModuleA中添加ViewAViewModel并让其实现IRegionMemberLifetime接口,此接口包含一个KeepAlive属性,该属性表示当从该VM对应的视图导航到其他视图时候,是否销毁该视图
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace ModuleA.ViewModels
{
public class ViewAViewModel : BindableBase,INavigationAware,IRegionMemberLifetime
{
public bool KeepAlive => false;
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return false;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
}
}
}
3 在ViewModels文件夹中添加ViewBViewModel类,因为IsNavigationTarget的返回为false,所以每次导航到ViewB时候都要新建一个视图
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 ViewBViewModel : INavigationAware
{
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return false;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
}
}
}
4 修改MainWindow界面增加显示视图增加删除的ItemsControl
<Window x:Class="RegionMemberLifetime.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525">
<DockPanel LastChildFill="True">
<StackPanel Orientation="Horizontal" DockPanel.Dock="Top" Margin="5" >
<Button Command="{Binding NavigateCommand}" CommandParameter="ViewA" Margin="5">Navigate to View A</Button>
<Button Command="{Binding NavigateCommand}" CommandParameter="ViewB" Margin="5">Navigate to View B</Button>
</StackPanel>
<ItemsControl ItemsSource="{Binding Views}" Margin="5">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="LightBlue" Height="50" Width="50" Margin="2">
<TextBlock Text="{Binding}" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ContentControl prism:RegionManager.RegionName="ContentRegion" Margin="5" />
</DockPanel>
</Window>
5 修改MainWindowViewModel
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Prism.BasicNavigate.ViewModels
{
public class MainWindowViewModel:BindableBase
{
IRegionManager regionManager;
private string _title;
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
private ObservableCollection<object> _views = new ObservableCollection<object>();
public ObservableCollection<object> Views
{
get { return _views; }
set { SetProperty(ref _views, value); }
}
public DelegateCommand<string> NavigateCommand { get; }
public MainWindowViewModel(IRegionManager regionManager)
{
this.regionManager = regionManager;
this.regionManager.Regions.CollectionChanged += Regions_CollectionChanged;
NavigateCommand = new DelegateCommand<string>(Navigate);
}
private void Regions_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
var region = (IRegion)e.NewItems[0];
region.Views.CollectionChanged += Views_CollectionChanged;
}
}
private void Views_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
Views.Add(e.NewItems[0].GetType().Name);
}
else if (e.Action == NotifyCollectionChangedAction.Remove)
{
Views.Remove(e.OldItems[0].GetType().Name);
}
}
private void Navigate(string navigatePath)
{
if (navigatePath!="")
{
regionManager.RequestNavigate("ContentRegion", navigatePath,NavigateCallBack);
}
}
private void NavigateCallBack(NavigationResult result)
{
Console.WriteLine($"Navigate to {result.Context.Uri} completed");
}
}
}