Prism 5 中 INavigationAware 的问题
Issues with INavigationAware in Prism 5
我对使用 Prism 的 WPF 和 MVVM 还很陌生,我在使用 Prism 导航时遇到了问题。每次导航到特定视图时,我都想加载一个新视图;但是,如果我输入一些数据或完全处理一些数据,离开并返回,现有数据始终保留在视图中。
我在 SO 上阅读过类似的问题,例如 this and this。两者都指向使用 INavigationAware
或 IRegionMemberLifetime
。我试图在我的 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; }
}
}
我对使用 Prism 的 WPF 和 MVVM 还很陌生,我在使用 Prism 导航时遇到了问题。每次导航到特定视图时,我都想加载一个新视图;但是,如果我输入一些数据或完全处理一些数据,离开并返回,现有数据始终保留在视图中。
我在 SO 上阅读过类似的问题,例如 this and this。两者都指向使用 INavigationAware
或 IRegionMemberLifetime
。我试图在我的 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; }
}
}