我正在使用Prism Unity,我有一个抽象的RecordViewModel:BindableBase,RecordListViewModel:RecordViewModel和RecordUpdateViewModel:RecordViewModel,INavigationAware。还有一个单独的导航模块,我的MainWindow有2个区域,NavigationRegion和ContentRegion。所有RecordView都驻留在ContentRegion中。无论出于何种原因,无论是制作GoBack按钮还是单击NavigationRegion中的按钮,我都无法离开更新视图。我已经缩小了ViewModel中存在的问题,并且我错过了INavigationAware的一些内容。请告诉我我错过了什么或做错了什么,谢谢。
public class RecordUpdateViewModel : RecordViewModel, INavigationAware
{
private IRegionNavigationJournal navigationJournal;
public RecordUpdateViewModel(IRecordService context) : base(context)
{
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return false;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
throw new NotImplementedException();
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
//irrelevant to problem logic to bring in Record.Id
navigationJournal = navigationContext.NavigationService.Journal;
}
}
修改
只是因为我在其他地方搞砸了我在module.cs中的注册
container.RegisterType<IRecordService, RecordService>();
container.RegisterTypeForNavigation<RecordListView>();
container.RegisterTypeForNavigation<RecordUpdateView>();
regionManager.RegisterViewWithRegion("ContentRegion", typeof(RecordListView));
regionManager.RegisterViewWithRegion("ContentRegion", typeof(RecordUpdateView));
我使用regionManager.RequestNavigate(“ContentRegion”,“RecordUpdateView”,参数)导航到视图,如果我不在UpdateView上使用INavigationAware,所有按钮都可以工作,但是当我把它放回去时我不能导航。
EDIT2
以下是导航到UpdateView和绑定命令
的ListView的XAML<UserControl x:Class="App.Record.Views.RecordListView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:prism="http://prismlibrary.com/"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
prism:ViewModelLocator.AutoWireViewModel="True">
<DockPanel>
<WrapPanel>
<Button Content="Edit"
Command="{Binding EditCommand}"/>
</WrapPanel>
<DataGrid>
<--Irrelevant-->
</DataGrid>
</DockPanel>
</UserControl>
命令
private DelegateCommand editCommand;
public DelegateCommand EditCommand => editCommand ?? (editCommand = new DelegateCommand(EditRecord));
private const string RecordID = "RecordID";
void EditCommand()
{
var parameter = new NavigationParameters();
parameter.Add("RecordID", SelectedRecord.ID);
regionManager.RequestNavigate("ContentRegion", "RecordUpdateView", parameter);
}
导航菜单按钮的命令工作原理相同,任何不使用INAVigationAware的视图都可以从中导航。
答案 0 :(得分:0)
INavigationAware与从视图导航到视图无关。它只是简单地为您提供了在视图之间传递参数的方法。我认为您正在寻找的是IRegionManager之类的东西,然后您可以像regionManager.NavigateTo(regionName,viewName)
这样做,您必须在容器中注册视图。像container.RegisterType<object,Views.View>(ViewNames.ViewName);
和ViewNames.ViewName
这样的东西是一个带有视图名称的常量字符串。
答案 1 :(得分:0)
我会垂头丧气......看看OnNavigatedFrom ...和所有3个INAVigationAware会员,看看其他任何人......并删除自动生成的NotImplementedExceptions。如果你不需要那个空虚,它就必须在那里,所以INAVigationAware并没有因为你没有完全实现它而对你大喊大叫,但是如果你不这样做,那么这些空洞中不存在任何逻辑。 #39; t需要它们。