我實際上是在嘗試使用 Caliburn Micro 的簡單容器運行選項卡控制元件,其中每個選項卡視圖模型在 c# 中實作一個介面“IMainScreenTabItem”。
設定容器時,我可以執行以下操作:
container.AllTypesOf<IMainScreenTabItem>(Assembly.GetExecutingAssembly());
這將允許我在選項卡控制元件視圖模型的建構式中獲取所有實作 IMainScreenTabItem 的視圖模型,如下所示:
public TabControlViewModel(IEnumerable<IMainScreenTabItem> tabs){ Items.AddRange(tabs); }
這個特定應用程式的問題是,當 TabControlViewModel 被釋放并且 .AllTypesOf 方法將它們注冊為單例時,我不希望實作作為單例保持活動狀態。
我可以通過硬編碼每個視圖模型來創建它們,如下所示:
container.Instance(container)
.PerRequest<IMainScreenTabItem, TabItem1>()
.PerRequest<IMainScreenTabItem, TabItem2>();
等等..但感覺有點亂。
我在想這樣的事情:
var tabs = GetType().Assembly.GetTypes()
.Where(type => type.IsClass)
.Where(type => !type.IsAbstract)
.Where(type => type.GetInterface(nameof(IMainScreenTabItem)) != null);
tabs.ToList().ForEach(tab => container.RegisterPerRequest(typeof(IMainScreenTabItem), tab.ToString(), tab));
問題是 .RegisterPerRequest 不允許我像 .PerRequest 那樣擁有單個介面的多個實作。
Caliburn Micro 的網站將差異描述為“每個請求注冊會導致每個請求創建一次回傳的物體。這意味著對同一物體的兩個不同請求將導致創建兩個不同的實體。” https://caliburnmicro.com/documentation/simple-container
所以我想做這樣的事情:
tabs.ToList().ForEach(tab => container.PerRequest<IMainScreenTabItem, tab>());
但顯然我得到“選項卡是一個變數,但用作型別”錯誤訊息。
對此的任何想法將不勝感激!這是我的第一個 Caliburn Micro 專案,所以我可能只是缺少一些簡單的東西。
提前致謝!
uj5u.com熱心網友回復:
您不能使用IMainScreenTabItem從程式集中決議所有實作的工廠方法嗎?:
container.Handler<TabControlViewModel>(container =>
{
var tabs = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(t => t.GetInterfaces().Contains(typeof(IMainScreenTabItem)))
.Select(t => (IMainScreenTabItem)Activator.CreateInstance(t))
.ToArray();
return new TabControlViewModel();
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/408091.html
標籤:
上一篇:來自ViewModel的Datagrid文本框中的自定義ContextMenu命令
下一篇:擊鍵事件不在C#WPF中執行
