在我的数据库中,我有一个表,其中包含不同的userControls项,其属性为“ClassName”,“AssemblyName”和“NameSpace”,这些都是使用反射初始化实例的必要条件。
我的想法是要从数据库中获取此集合,将集合设置为数据上下文,并将这些用户控件动态加载到tabcontrol中。我可以使用一个“tabItem”来包含它,并在运行时在代码中加载它。如果它可以直接从模板中的XAML完成,我想它会非常方便和花哨。
我一直在寻找类似的东西,但没有使用背后的代码就找不到任何东西。
我在考虑以下内容
<TabControl.ContentTemplate>
<DataTemplate>
<xxxControl ClassName="{Binding ClassName}" AssemblyName="{Binding AssemblyName}" NameSpace="{Binding NameSpace}" />
</DataTemplate>
</TabControl.ContentTemplate>
我可以制作这样的自定义“xxxControl”,但如果这样的东西已经存在,那将浪费时间。这样,GUI可以通过DB中的参数完全生成。
答案 0 :(得分:1)
你可以使用markup extensions在XAML中做很多事情,在这种情况下你可以创建一个从给定信息中实例化控件的东西。为此,它需要一些可以绑定的依赖属性,然后在ProvideValue
中它将获得程序集,构造全名并实例化它。
用法:
<DataTemplate>
<me:Instance Assembly="{Binding AssemblyName}"
NameSpace="{Binding NameSpace}"
Class="{Binding ClassName}"/>
</DataTemplate>
显然你仍然有代码隐藏,但它应该是这样的,命令式代码不属于XAML。
我还怀疑你的数据库应该包含有关UI控件的信息......
答案 1 :(得分:1)
唉。不要直接从数据库控制UI。你最接近的(假设你无法进行重大的架构更改)IMO将你的数据库条目加载到VM中的IObservable
,并使用DataTemplateSelector将你的集合转换为UI控件。