2013-05-15 41 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

相关问题