4

私のDBには、リフレクションを使用してインスタンスを初期化するために必要な属性「ClassName」、「AssemblyName」、および「NameSpace」を持つuserControlsのさまざまなアイテムを含むテーブルがあります。

私の考えは、DBからこのコレクションを取得するには、コレクションをデータコンテキストとして設定し、これらのユーザーコントロールをタブコントロールに動的にロードすることでした。それを含む「tabItem」を使用し、実行時に分離コードでロードすることができます。テンプレートで XAML から直接実行できれば、非常に便利ですばらしいと思います。

私は似たようなことをグーグルで検索してきましたが、コードビハインドを使用しないと何も見つかりませんでした。

以下のようなことを考えていました

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

このようなカスタムの「xxxControl」を作成することはできますが、そのようなものが既に存在すると時間の無駄になります。このように、GUI は DB 内のパラメーターによって完全に生成できます。

4

2 に答える 2

1

うーん。データベースから直接 UI を制御しないでください。最も近いのは (アーキテクチャを大幅に変更できないと仮定して) IMO は、DB エントリをIObservableVM の にロードし、DataTemplateSelectorを使用してコレクションを UI コントロールに変換することです。

于 2013-05-15T18:50:47.793 に答える
1

マークアップ拡張機能を使用して XAML で多くのことを行うことができます。この場合、指定された情報からコントロールをインスタンス化するものを作成できます。そのためには、バインドできるいくつかの依存関係プロパティが必要であり、その中ProvideValueでアセンブリを取得し、完全な名前を構築してインスタンス化します。

使用法:

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

明らかにコード ビハインドが残っていますが、そうあるべきです。命令型コードはXAML にはまったく属していません。

また、データベースにUIコントロールに関する情報が含まれている必要があるとは思えません...

于 2013-05-15T12:37:03.123 に答える