我有幾個用戶控件(在不同的DLL中),我作爲TabItems插入到我的主應用程序(EXE)的TabControl中。這是我用來加載它,並把它添加到TabControl的XAML:如何動態加載UserControls到TabControl
<TabControl x:Name="mainTabControl">
<TabItem Style="{StaticResource VertAlign}" Header="firstDll">
<view1:ControlOfTheFirstDll />
</TabItem>
<TabItem Style="{StaticResource VertAlign}" Header="secondDll">
<view2:ControlOfTheSecondDll />
</TabItem>
</TabControl>
現在,我改變了我的計劃,使我動態加載每個DLL(Data1.dll
,Data2.dll
)。隨着我的程序啓動,創建了以下類Plugin
的一個實例,可以從我的ViewModel中訪問它。
class Plugin
{
[ImportMany]
public IEnumerable<IDataProvider> DataProvider { get; set; }
public Plugin()
{
try
{
AggregateCatalog aggregatecatalogue = new AggregateCatalog();
aggregatecatalogue.Catalogs.Add(new AssemblyCatalog(Assembly.LoadFile("...\\Data1.dll")));
aggregatecatalogue.Catalogs.Add(new AssemblyCatalog(Assembly.LoadFile("...\\Data2.dll")));
aggregatecatalogue.Catalogs.Add(new AssemblyCatalog(Assembly.GetAssembly(typeof(IDataProvider))));
CompositionContainer container = new CompositionContainer(aggregatecatalogue);
container.ComposeParts(this);
}
catch (FileNotFoundException fnfex)
{
Console.WriteLine(fnfex.Message);
}
catch (CompositionException cex)
{
Console.WriteLine(cex.Message);
}
}
}
不知何故,我需要加載用戶控件,這是基於在Data1.dll
和Data2.dll
,動態。例如:
<TabControl x:Name="mainTabControl">
<TabItem Style="{StaticResource VertAlign}" Header="firstDll">
<ContentControl Content="{Binding PluginInstance.Control.???}" />
</TabItem>
<TabItem Style="{StaticResource VertAlign}" Header="secondDll">
<ContentControl Content="{Binding PluginInstance.Control.???}" />
</TabItem>
</TabControl>
但是,我似乎無法獲得控制工作的綁定。
的視圖模型用戶控件:我做的比你的解決方案類似的東西,但有問題,如果我要顯示在同一種類的2個控制同一個窗口,我只得到1個實例。是否有可能創建2個相同控件的實例? – MTR 2015-04-23 08:12:41