我正在使用Prism编写一个WPF MVVM应用程序。几天前,我询问了管理不同视图的最佳实践,但没有得到很多反馈。因此,我想出了一个似乎可以工作的系统,但我想确保我不会被咬到。
我按照http://development-guides.silverbaylabs.org/上的教程进行了shell设置,并且确信我的模块已经被很好地注册了。
然而,在这些教程中,没有一个在给定区域内用不同的视图替换视图的示例。一般来说,似乎很难找到一个很好的例子。所以,今天我提出了我自己的解决方案。
本质上,模块有一个跟踪当前视图的控制器,然后当用户想要切换视图时,它调用Regions.Remove命令,然后调用add命令,将其替换为当前视图。似乎必须有一个更优雅的解决方案来在不同的注册视图之间切换,但我还没有找到它。
当模块初始化时,模块的所有不同的可能视图都注册到Unity容器中。
控制器和视图切换功能如下:
namespace HazardModule
{
public class HazardController : IHazardController
{
private object CurrentView;
public IRegionManager RegionManager { get; set; }
private IUnityContainer _container;
public HazardController(IUnityContainer container)
{
_container = container;
}
/// <summary>
/// Switches the MainRegion view to a different view
/// </summary>
/// <typeparam name="T">The class of the view to switch to</typeparam>
public void SiwthToView<T>()
{
if (CurrentView != null)
{
RegionManager.Regions["MainRegion"].Remove(CurrentView);
}
CurrentView = _container.Resolve<T>();
RegionManager.Regions["MainRegion"].Add(CurrentView);
}
}
}任何反馈或其他更好的解决方案都将不胜感激。
发布于 2010-09-07 14:35:05
我有几乎相同的方法,一个比我有更多棱镜经验的同事也是如此。
基本上,我有一个ViewController类,它是我的ViewModelBase类中的一个属性。这使得我所有的ViewModels都可以一次性访问它。然后,在我的ViewController类中,我有一些显示管理方法。这种方法的正确性可能是有争议的,但我发现它在我的情况下工作得很好。
public TView ShowViewInRegion<TView>(string regionName, string viewName, bool removeAllViewsFromRegion)
{
var region = regionManager.Regions[regionName];
var view = region.GetView(viewName) ?? container.Resolve<TView>();
if (removeAllViewsFromRegion)
{
RemoveViewsFromRegion(region);
}
region.Add(view, viewName);
region.Activate(view);
if (regionName == RegionNames.OverlayRegion)
{
eventAggregator.GetEvent<PopupWindowVisibility>().Publish(true);
}
return (TView)view;
}
public void RemoveViewsFromRegion(string regionName)
{
RemoveViewsFromRegion(regionManager.Regions[regionName]);
}
private void RemoveViewsFromRegion(IRegion region)
{
for (int i = 0; i < region.Views.Count() + i; i++)
{
var view = region.Views.ElementAt(0);
region.Remove(view);
}
if (region.Name == RegionNames.OverlayRegion)
{
eventAggregator.GetEvent<PopupWindowVisibility>().Publish(false);
}
}
private static void DeactivateViewsInRegion(IRegion region)
{
for (var i = 0; i < region.ActiveViews.Count(); i++)
{
var view = region.ActiveViews.ElementAt(i);
region.Deactivate(view);
}
}然后,每当我需要切换视图或任何我可以从ViewModel调用的东西时
public void ExecuteCreateUserCommand()
{
ViewController.ShowViewInRegion<IUserCreateView>(RegionNames.ContentRegion, ViewNames.UserCreateView, true);
}https://stackoverflow.com/questions/3527608
复制相似问题