【问题标题】:How to get a name of the active view in PRISM如何在 PRISM 中获取活动视图的名称
【发布时间】:2013-09-09 13:26:55
【问题描述】:

我正在尝试导航到相同的视图(与活动视图相同),但使用了新参数。问题是我很难找到一种干净的方法来从 RegionManager 获取当前活动视图的名称

【问题讨论】:

  • IRegion 有一个ActiveViews 属性,它将为您提供所有当前活动视图的只读集合。你试过吗?
  • @BrianS 这个集合继承自 IEnumerable,它只有一个实际的视图对象,但没有它的名称。换句话说,活动视图不提供任何方法来查找视图的实际名称。
  • 我不清楚设计,以及为什么您无法确定它是从对象的哪个视图。你能创建一个IMyView 接口和一个所有视图都实现的Name 属性,然后将对象转换为IMyView 并获取视图的名称吗?
  • 听起来你可能在一个区域中有多个相同视图的实例,每个实例都有不同的参数来区分它。那是对的吗?您想知道哪个实例当前处于活动状态?
  • 是的,我已经考虑过这个选项,但是你必须实现单独的接口只是为了绕过 PRISM 而不暴露一些私有字段,这并不是很好。我希望有一种更清洁的方式来做到这一点

标签: wpf c#-4.0 prism-4


【解决方案1】:

根据我的理解,我建议在您的每个视图上实现一个接口,该接口提供必要的信息以确定它是哪个视图,然后使用IRegion 的ActiveViews 属性访问活动视图。

类似:

//Interface for identifying the Views
public interface IApplicationView
{
    string ViewName { get; }
}

//Example of a View with logic to determine which instance of the View it is
public class ApplicationView : UserControl, IApplicationView
{
    public string ViewName 
    { 
        get { return this.isViewA ? return "ViewA" : return "ViewB"; } 
    }
}

//Example of determining which view
public class OtherComponent
{
    public string GetActiveViewName(IRegion region)
    {
        IApplicationView activeView = region.ActiveViews.FirstOrDefault() as IApplicationView;
        return activeView == null ? string.Empty : activeView.ViewName;
    }
}

【讨论】:

  • 据我所知,没有一个干净的方法可以做到这一点,所以上面的方法解决了这个问题。
  • 有没有办法使用 IoC 容器(在我的情况下为 DryIoc)获取现有的 ViewModel?我从ShellViewModel 尝试了this == _Container.Resolve<ShellViewModel>,它评估为false。
【解决方案2】:

我不确定这个方法是否在 Prism 4 中实现。但在 Prism 6 中,您可以使用 NavigationService Journal 获取活动视图的名称。

例如:

string name = RegionManager.Regions["MainRegion"].NavigationService.Journal.CurrentEntry.Uri;

【讨论】:

    猜你喜欢
    • 2014-10-02
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多