[英]Using single View for multiple ViewModels with Caliburn.Micro on Windows Phone 8.1
我有一個使用Caliburn.Micro的Windows Phone 8.1應用程序。 在應用程序中,我有一些ViewModel以不同的方式和不同的邏輯獲取數據,但以相同的方式顯示它們。 所以我想讓所有那些ViewModel使用相同的View。
我發現ViewLocator.LocateTypeForModelType
是一個為將ViewModels映射到Views而執行的方法。 所以我重寫它以在使用時使用我的自定義屬性:
var original = ViewLocator.LocateTypeForModelType;
ViewLocator.LocateTypeForModelType = (modelType, displayLocation, context) =>
{
var useViewAttributes = modelType.GetTypeInfo().GetCustomAttributes<UseViewAttribute>(true);
if (useViewAttributes.Count() == 1)
{
var viewTypeName = string.Concat(modelType.Namespace.Replace("Model", string.Empty), ".", useViewAttributes.First().ViewName);
var type = AssemblySource.FindTypeByNames(new List<string>() { viewTypeName });
return type;
}
return original(modelType, displayLocation, context);
};
單步執行它似乎工作正常。 如果我導航到ViewModel並且ViewModel有一個UseView,我的方法會返回正確的View。
該應用程序導航到正確的視圖,但從未創建ViewModel。 有點像Caliburn.Micro忘了ViewModel,或者正在尋找一個使用不同的約定或其他東西。
我發現ViewModelLocator.LocateTypeForViewType
是導航后調用視圖來解決視圖模型。 上一步中的ViewModel類型似乎完全被遺忘了。
在ViewModelLocator.LocateTypeForViewType
我只能訪問View類型,我不知道如何使其解析上一步中正確的ViewModel。 我可以掃描所有ViewModel並找到具有正確屬性的ViewModel,但我不知道選擇哪一個。
關於如何處理這個的任何想法?
這是一個顯示我的設置的最小項目: https : //dl.dropboxusercontent.com/u/73642/CMVMTest.zip
除了頂級導航之外,這種解決方案可以在其他任何地方使用。 這樣做的原因是有一種“雙重調度:當你導航時繼續進行。
如您所知, Frame
或PhoneNavigationFrame
控件(取決於WinRT或Silverlight)是基於其導航的視圖。 所以步驟看起來有點像這樣。
ProductViewModel
。 ViewLocator
(您已注入代碼的位置)來定位ProductView
並告訴Frame
導航到那個。 ProductView
並使用ViewModelLocator
定位正確的視圖模型。 這種用於查看導航服務中的模型步驟的視圖模型會導致代碼中的打嗝。
您應該能夠創建簡單地繼承基本視圖並且不添加任何內容的虛擬視圖。 因此,如果你有MySharedView.xaml
那么聲明下面的內容就足夠了。
public class SecondView : MySharedView { }
我知道它並不理想,但確實可以讓你重復使用。 讓導航服務記住導航事件和導航事件之間的視圖模型變得復雜,所有外部因素也會導致導航。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.