0

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

我在这里阅读过类似的问题,例如thisthis。两者都指向使用INavigationAwareor IRegionMemberLifetime。我试图在我的 ViewModel 中实现这两者;但是,似乎没有人为我解决这个问题。

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

我可以发布代码;但是,它很简单,看起来与链接问题中的相同。有人对 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;
    }
}

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

4

1 回答 1

0

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

正因为如此,看起来虚拟机一直处于活动状态,但实际上并非如此。它每次都会像往常一样加载,但它会从没有重新加载的对象中拉出。

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

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

public class ModuleAViewModel : BindableBase, IConfirmNavigationRequest, INavigationAware, IRegionMemberLifetime
{
 ...
        bool IRegionMemberLifetime.KeepAlive
    {
        get { return false; }
    }
}
于 2015-02-18T23:15:14.303 回答