簡體   English   中英

使用Prism,如何將作用域RegionManager注入服務?

[英]With Prism, how can I inject a scoped RegionManager into a service?

我正在開發一個Prism應用程序,它包含一個包含幾個子區域的TabControl 因此,我根據Brian Lagunas在他的PluralSight課程中描述的模式實現了一個自定義RegionBehavior,該課程在https://app.pluralsight.com/library/courses/prism-mastering-tabcontrol/上找到並注入一個自定義的RegionNavigationContentLoader也在上述課程,以確保我沒有異常,並可以在我的TabControl的幾個選項卡上具有相同名稱的區域。

對於那些無法訪問PluralSight的人:

我實現了一個監視區域的Views-collection的行為,並且當它發生更改時,檢查添加的視圖或其DataContext是否實現了特定的接口。 如果檢測到此接口,則會將作用域RegionManager設置為該接口的屬性,因此進入作用域區域的所有視圖都可以知道其作用域RegionManager。

但是,我也有一些服務需要這個作用域RegionManager才能導航到我的TabControl中的子區域。

由於我在容器中創建此服務,因此它會獲取注入的全局RegionManager而不是作用域。

我的問題是:

  1. 是否有任何模式或結構允許將范圍內的RegionManagers注入服務?
  2. 如果1的答案為否,那么服務是否應該導航到區域或者這是一個壞主意?

更新

您可以在下面找到我的應用程序的計划結構。 我希望它能說明為什么我要從服務中導航到作用域區域:

應用布局

該應用程序包含一個已提到的TabControl ,其中每個TabItems都包含一個分析

分析總是由選定的可視化組成,可以在右上方的框中選擇。 當選擇可視化時,它在服務中被激活,該服務主要調用代碼來生成可視化,檢查設置的有效性等。

然后,可視化應顯示在VisualisationRegion中,特定於可視化的設置應顯示在SettingsRegion中。

我的計划是從服務中導航到這兩個區域。

由於無法預先生成可視化(在顯示之前必須始終執行檢查,因此無法直接從視圖/視圖模型導航。即使可能,顯示所有可視化類型的視圖也不知道作用域RegionManager,因為它是一個組合視圖的一部分(父視圖是知道的,當然可以將作用域RegionManager注入其子視圖,但在我看來,這似乎是一個代碼氣味)

這種類型的應用程序可能不適合Prism導航方法,或者您是否知道如何重構我的應用程序以更好地適應Prism?

您無法將范圍區域管理器注入您的服務。 哎呀,你甚至無法將一個范圍區域管理器注入Viewmodel,這就是為什么你需要自定義行為來獲取它的原因。

  1. 一種選擇是將RegionManager屬性添加到服務,並將該屬性設置為VM中的作用域區域管理器實例。
  2. 我不確定我是否有任何服務導航到范圍區域。 這似乎對服務承擔了太多責任,這可能導致不必要的復雜性。 在這種情況下,我希望服務返回我的VM可以響應的結果,以便導航它需要的位置。 根據服務需要導航的原因,您可以采用另一種方法來完成相同的操作。

更新:我將可視化類型作為主選項卡視圖的一部分。 我認為沒有任何理由說這應該是一個單獨的地區。 現在,您將可以訪問作用域區域管理器,現在可以將視圖導航到VisualizationRegion。 該服務應該不了解區域經理。 只需響應可視化類型選擇更改,調用所需服務,獲取結果並進行相應導航。

除了Brians的回答,如果你真的需要在你的ScopedRegionManager上執行邏輯,我會推薦兩種方法。

  1. 讓您的服務不知道您的RegionManager或導航邏輯。 您還可以返回在服務完成其邏輯時要執行的Action或Func。
  2. 當沒有需要替換的邏輯(更改實例注冊)時,您也可以將邏輯放入RegionManager的擴展方法中:

_

   public static IRegionManager NavigateView(this IRegionManager regionManager, string regionName, string view, NavigationParameters parameters = null)
   {
       var navigationUri = new Uri(view, UriKind.Relative);
       regionManager.RequestNavigate(regionName, navigationUri, parameters);
       return regionManager;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM