1

我有一个实现以下接口的用户控件:

public interface IView
    {
        object DataContext { get; set; }
    }

..它是实现以下接口的相应视图模型:

 public interface ICertificationViewModel
    {     
        string NumOfCertification { get; set; }
    }

我有另一个名为 NavigationService 的服务,它实现了以下接口:

 public interface INavigationService<TView,TViewModel>
    {
        void ShowView<TView,TViewModel,T>(T model) where T:class;
    }

我正在使用统一,每当调用导航服务上的 ShowView 方法时,我都需要将一个新的(瞬态)视图和视图模型放在一起。我不能将 View 和 ViewModel 作为构造函数依赖项注入(因为应该创建新实例),并且我不想采用服务定位器路由(即在 ShowView 中调用 unity 来解析视图和视图模型)。有没有办法可以使用统一或其他任何方法来解决这个问题?我到处搜索,但找不到明确的答案。我使用的是 Prism 和 .NET 3.5。我还想保持这种通用性,以便可以使用 NavigationService ShowView 方法解决任何视图和视图模型。

你能帮忙解决一下吗?

4

1 回答 1

1

Prism库提供了一个RegionNavigationService来控制View之间的导航RegionNavigationService实现了IRegionNavigationService并定义了RequestNavigate()方法。您可以为在指定区域中注册的任何视图解析导航(通过不同区域中的视图导航是没有意义的)。

/// <summary>
/// Provides navigation for regions.
/// </summary>
public interface IRegionNavigationService : INavigateAsync
{
    ...
}

导航异步:

/// <summary>
/// Provides methods to perform navigation.
/// </summary>
/// <remarks>
/// Convenience overloads for the methods in this interface can be found as extension methods on the 
/// <see cref="NavigationAsyncExtensions"/> class.
/// </remarks>
public interface INavigateAsync
{
    /// <summary>
    /// Initiates navigation to the target specified by the <see cref="Uri"/>.
    /// </summary>
    /// <param name="target">The navigation target</param>
    /// <param name="navigationCallback">The callback executed when the navigation request is completed.</param>
    /// <remarks>
    /// Convenience overloads for this method can be found as extension methods on the 
    /// <see cref="NavigationAsyncExtensions"/> class.
    /// </remarks>
    void RequestNavigate(Uri target, Action<NavigationResult> navigationCallback);
}

如果您在ShowView()方法中完成了一些自定义的前后导航工作,则可以在所涉及的视图视图模型上实现定义OnNavigatedTo ()OnNavigatedFrom()的 INavigationAware 。

要了解这些方法的工作原理,以下QuickStart使用OnNavigatedTo()方法来读取和设置新导航视图上的任何上下文参数:

INavigationAware文档:

如果这没有帮助,了解ShowView()方法的预期行为会很有用。

问候。

于 2013-10-01T14:23:51.460 回答