Prism 5 中 INavigationAware 的问题

Issues with INavigationAware in Prism 5

我对使用 Prism 的 WPF 和 MVVM 还很陌生,我在使用 Prism 导航时遇到了问题。每次导航到特定视图时,我都想加载一个新视图;但是,如果我输入一些数据或完全处理一些数据,离开并返回,现有数据始终保留在视图中。

我在 SO 上阅读过类似的问题,例如 this and this。两者都指向使用 INavigationAwareIRegionMemberLifetime。我试图在我的 ViewModel 中实现这两个;但是,none 似乎可以解决我的问题。

如果我使用 INavigationAware 并将 IsNavigationTarget 设置为 false,则视图永远不会加载。如果我使用 IRegionMemberLifetime 并将 KeepAlive 设置为 false,它仍会保留我的数据。

我可以post编码;但是,它很简单,看起来与链接问题中的一样。有没有人遇到过 Prism 导航的类似问题?

感谢任何帮助。

编辑 - 添加示例代码

为了用我得到的其他代码摆脱任何红色鲱鱼,我用最基本的必需品创建了一个新的 Prism 应用程序。返回导航时视图不显示的问题已经解决;但是,视图仍保留输入的值。

下面是一些示例代码:

型号:

public class SomeObject
{
    public string ObjectName { get; set; }

}

我创建了一个只有两个 TextBox 控件的基本视图,1 个绑定,1 个不绑定:

<StackPanel>
    <TextBlock Text="ModuleA" />
    <TextBox Text="{Binding DisplayedSomeObject.ObjectName, UpdateSourceTrigger=PropertyChanged}" />
    <TextBox />
</StackPanel>

视图模型:

[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
[RegionMemberLifetime(KeepAlive=false)]
public class ModuleAViewModel : BindableBase, IConfirmNavigationRequest, INavigationAware
{
    private SomeObject displayedSomeObject = new SomeObject();
    public SomeObject DisplayedSomeObject
    {
        get { return displayedSomeObject; }
        set
        {
            displayedSomeObject = value;
        }
    }

    [ImportingConstructor]
    public ModuleAViewModel()
    {

    }

    void IConfirmNavigationRequest.ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
    {
        continuationCallback(true);
    }


    bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext)
    {
        return false;
    }

    void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext)
    {
    }

    void INavigationAware.OnNavigatedTo(NavigationContext navigationContext)
    {
        var newSomeObject = new SomeObject();
        this.DisplayedSomeObject = newSomeObject;
    }
}

当我 运行 这样做时,绑定控件和未绑定控件在导航回时都保留它们的值。

您对导航进行过一些故障排除吗?在页面导航到时设置一个断点,看看所有数据是如何返回的。我以为我以前遇到过同样的问题,我愚蠢地将一个对象加载到我的 VM 中,这个对象永远不会被破坏。

因此,看起来 VM 一直处于活动状态,但实际上并非如此。它每次都会正常加载,但它会从未重新加载的对象中提取。

因此,在 navigateTo 上设置一个断点并单步执行以查看是否正在重新加载数据。

编辑: 查看上面的代码,我相信您还需要添加 IRegionMemberLifetime。我目前正在使用 Prism 4.5,所以我不知道这在 5 中是否有所改变,但我必须添加它才能真正销毁它。

public class ModuleAViewModel : BindableBase, IConfirmNavigationRequest, INavigationAware, IRegionMemberLifetime
{
 ...
        bool IRegionMemberLifetime.KeepAlive
    {
        get { return false; }
    }
}