【问题标题】:Is it possible to use reflection directly in XAML是否可以直接在 XAML 中使用反射
【发布时间】:2013-05-16 02:50:47
【问题描述】:

在我的数据库中,我有一个表,其中包含用户控件的不同项目,这些项目具有属性“ClassName”、“AssemblyName”和“NameSpace”,这些属性是使用反射初始化实例所必需的。

我的想法是要从数据库中获取此集合,请将集合设置为数据上下文并将这些用户控件动态加载到选项卡控件中。我可以使用包含它的“tabItem”,并在运行时加载它的代码。我想如果它可以直接从模板中的 XAML 完成,那将非常方便和精美。

我一直在用谷歌搜索类似的东西,但没有使用后面的代码,一无所获。

我在想类似下面的事情

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

我可以制作这样一个自定义的“xxxControl”,但如果这样的东西已经存在,那将是浪费时间。这样就可以完全由DB中的参数生成GUI了。

【问题讨论】:

    标签: c# wpf xaml reflection


    【解决方案1】:

    您可以使用markup extensions 在 XAML 中做很多事情,在这种情况下,您可以创建一个根据给定信息实例化控件的功能。为此,它需要一些可以绑定的依赖属性,然后在ProvideValue 中获取程序集,构造全名并实例化它。

    用法:

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

    显然你仍然有代码隐藏,但它应该是这样的,命令式代码根本不属于 XAML。

    我也怀疑您的数据库是否应该包含有关 UI 控件的信息...

    【讨论】:

    • 这种方法是我想到的。我希望 WPF 中已经存在类似的东西,所以我不必自己做
    • 真的。您建议从哪些控件继承。用户控制?选项卡项?
    • @user853710:您创建的不是控件而是MarkupExtension,它是一个返回某些内容的类,然后将其放置在 XAML 中出现的位置。
    • 我做到了。好的。尝试添加反射类时出现此错误。程序集 ass = (!string.IsNullOrEmpty(SubModuleObject.AssemblyName) ? System.Reflection.Assembly.LoadFrom(SubModuleObject.AssemblyName) : System.Reflection.Assembly.GetExecutingAssembly()); UserControl x = ass.CreateInstance(string.Format("{0}.{1}", SubModuleObject.NameSpace, SubModuleObject.ClassName)) as UserControl; grid.children.add(x);我收到以下错误“无法从对象转换为 system.windows.UIElement”
    • @user853710:正如我所说,您应该只返回用户控件而不是将其添加到网格中。此外,如果该错误出现在您的反射代码中,您应该搜索它,这个问题应该与 WPF 方面有关,而不是您如何实现后端。
    【解决方案2】:

    呃。不要直接从数据库控制您的 UI。您应该最接近的方式(假设您不能进行重大的架构更改)IMO 是将您的数据库条目加载到您的 VM 中的 IObservable 并使用 DataTemplateSelector 将您的集合转换为 UI 控件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2022-01-21
      • 2012-03-02
      相关资源
      最近更新 更多