我对使用Prism的WPF和MVVM相当新,我遇到了Prism导航的问题。每次我导航到特定视图时,我都想加载一个新视图;但是,如果我输入一些数据或完全处理某些数据,导航并返回,现有数据将始终保留在视图中。
我在此处阅读了类似的问题,例如this和this。两者都指向使用INavigationAware
或IRegionMemberLifetime
。我试图在我的ViewModel中实现它们;但是,似乎没有人为我解决这个问题。
如果我使用INavigationAware
并将IsNavigationTarget
设置为false,则视图永远不会加载。如果我使用IRegionMemberLifetime
并将KeepAlive
设置为false,则仍会保留我的数据。
我可以发布代码;然而,它很简单,看起来和链接问题一样。有没有人与棱镜导航有类似的问题?
感谢任何帮助。
编辑 - 添加示例代码
为了摆脱任何红色鲱鱼和其他代码,我创造了一个新的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;
}
}
当我运行它时,绑定和未绑定控件在导航回来时都会保留它们的值。
答案 0 :(得分:0)
您是否对导航进行了一些故障排除?设置一个断点到页面导航到的时间,看看所有数据是如何重新进入的。我以前认为我遇到了同样的问题而且我愚蠢地将一个对象加载到我的VM中,这个对象永远不会被破坏。
正因为如此,看起来虚拟机仍处于活着状态,但事实并非如此。它每次都会像正常一样加载,但它会从没有重新加载的对象中拉出来。
因此,在navigateTo上设置断点并逐步查看数据是否重新加载。
编辑: 看看上面的代码,我相信你也需要添加IRegionMemberLifetime。我目前正在使用Prism 4.5,所以我不知道这是否在5中有所改变,但我必须添加它以实际销毁它。
public class ModuleAViewModel : BindableBase, IConfirmNavigationRequest, INavigationAware, IRegionMemberLifetime
{
...
bool IRegionMemberLifetime.KeepAlive
{
get { return false; }
}
}