是否可以直接在XAML中使用反射

时间:2013-05-15 12:22:18

标签: c# wpf xaml reflection

在我的数据库中,我有一个表,其中包含不同的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中的参数完全生成。

2 个答案:

答案 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控件。