INAVigationAware无法导航

时间:2018-04-12 17:04:57

标签: c# wpf prism

我正在使用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的视图都可以从中导航。

2 个答案:

答案 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需要它们。