2013-05-15 45 views
4

在我的數據庫中,我有一個表,其中包含具有屬性「ClassName」,「AssemblyName」和「NameSpace」的userControls的不同項目,這些屬性需要使用反射初始化實例。是否有可能直接在XAML中使用反射

我的想法是要從數據庫中獲取這個集合,將集合設置爲數據上下文並動態地將這些用戶控件加載到tabcontrol中。我可以使用一個「tabItem」來包含它,並在運行時在後面的代碼中加載它。我想如果可以通過模板直接從XAML完成,那將會非常方便並且很花哨。

我一直在谷歌類似的東西,但沒有使用代碼背後沒有發現。

我想類似如下的

 <TabControl.ContentTemplate> 
      <DataTemplate> 
       <xxxControl ClassName="{Binding ClassName}" AssemblyName="{Binding AssemblyName}" NameSpace="{Binding NameSpace}" /> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 

我可以做這樣一個自定義「中,xxxcontrol」,但如果類似的東西已經存在這將是浪費時間。通過這種方式GUI可以由數據庫中的參數完整生成。

回答

1

您可以使用markup extensions在XAML中做很多事情,在這種情況下,您可以創建一個實例化來自給定信息的控件。爲此,它需要一些可以綁定的依賴項屬性,然後在ProvideValue中獲得程序集,構建完整名稱並實例化它。

用法:

<DataTemplate> 
    <me:Instance Assembly="{Binding AssemblyName}" 
       NameSpace="{Binding NameSpace}" 
       Class="{Binding ClassName}"/> 
</DataTemplate> 

很明顯,你仍然有代碼的背後,卻是應該的,必要的代碼做在XAML屬於可言。

另外我懷疑你的數據庫應該包含有關UI控件的信息...

+0

這種方法是我想到的。我希望WPF中已經存在這樣的東西,所以我沒有做到這一點我自己 – user853710

+1

@ user853710:不是我所知道的,但寫標記擴展是相當容易的... –

+0

是真的。 你會建議繼承哪些控件。用戶控件? TabItem的? – user853710

1

呃。不要直接從數據庫控制你的用戶界面。最接近你應該來(假設你不能做出重大的體系結構更改)IMO會將您的數據庫條目加載到虛擬機中的IObservable,並使用DataTemplateSelector將您的集合轉換爲UI控件。

+0

DataTemplateSelectors對此非常有用! – mbmcavoy

相關問題