簡體   English   中英

使用帶有 IsNavigationTarget 的 Prism 處理嵌套視圖,可以返回 false

[英]Working with nested views using Prism with IsNavigationTarget which can return false

我正在嘗試為以下問題找到解決方案。 我有一個 WPF 應用程序,我使用 mvvm 和 prism(最新版本 7)來構建它。 這是我處理的表單/對話框的草稿: 用戶對話結構

MainView 有區域 - region1,我根據 treeview 中選擇的內容將 SubViewA 注入到 region1。 此視圖表示樹項內容。 SubViewA 自身有區域 - region2,另一個視圖 - SubViewB 根據 combobox 選擇被注入到 region2 中。

我使用 INavigationAware 來管理對該區域的注入。

因此,要將視圖注入我從 MainViewModel 使用的區域,請執行以下操作:

_regionManager.RequestNavigate(regionName, viewName, callBack, parameters);

在 SubViewAViewModel 中,我實現了 INavigationAware,為了重用創建的視圖,我檢查是否創建了每個樹項的視圖。 為此,我將 treeitemId 添加到參數中,然后在 IsNavigationTarget 方法中檢查此 ID,如下所示:

bool IsNavigationTarget(NavigationContext navigationContext)
{
    // get id parameter from navigationContext.Parameters
    // check if subviewA for treeitemId was already shown and return true,
    // i use dictionary, where i store ids of all items that were selected in the past
    // otherwise return false.
}

當我想將 SubViewB 注入 SubViewA 的區域 2 時,我使用的方法相同。 大多數情況下,當用戶更改下拉選擇時,會注入新的 SubViewB。

現在我的問題是——如果我在 SubViewBViewModel 中使用 INavigationAware 並且當 IsNavigationTarget 總是返回 true 時——一切都很好。 當我嘗試重用視圖並再次選擇返回 true 或 false 時,當我在 treeview 中的第二項 select 時出現異常:“具有給定名稱的區域已注冊” - prism 抱怨 region2 已注冊。

我知道當顯示視圖時我可以擁有服務並始終從服務中填充數據,因此我不需要重用視圖。 但這是一個更學術的問題——解決它的正確方法是什么?

PS 我嘗試注冊作用域區域管理器,但沒有成功,我的問題是我不知道創建新作用域管理器的最佳位置在哪里以及如何將其注入視圖模型。 父母的 ViewModel 不是這樣做的好地方,因為我必須公開視圖。 如果我嘗試使用附加行為,那么似乎區域內容會在調用行為之前更新。

PS2 我從復數視覺(Brian Lagunas)中找到了一個示例,他在其中創建了兩個外殼,但它與我想要實現的不同。 在創建 window 的那一刻,他根據 window 創建了新的 scope 管理器。 而且,如果 window 本身具有與我上面顯示的相同的結構,它也會失敗。

PS3 我觀看了來自 Brian Lagunas 的最新流,他正在從頭開始編寫 outlook,他的方法基於行為,他將一些視圖與依賴視圖相關聯,它工作正常,但在他的示例中,依賴視圖再次不包含區域。

謝謝你。

對細節感興趣的小伙伴可以看看以下pluralsight課程:pluralsight.pxf.io/XVxR5 &pluralsight.pxf.io/B6X99。 一個是關於多個 shell 的,另一個是關於選項卡式控制的,它被稱為“棱鏡問題和解決方案:掌握 TabControl”——這門課程幫助了我。

簡而言之,問題在於如何在主視圖模型中注入 scope 區域。 為了解決這個問題,我們重寫了 ScopedRegionNavigationContentLoader plus 來控制我們想要注入作用域區域管理器還是我們必須標記接口的全局管理器。

我創建了另一個與當前問題類似的問題:請檢查Prism 7 throws and exception when working with nested views 它會給你更多的細節。

暫無
暫無

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

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