2011-02-19 10 views
0

私はDBマイグレーション用のアプリケーションを作成しています。私はWPF GUIを使ってマルチスレッドフレームワークを作った。WPF "partial forms"

class Something : Migrator { 
    public override Run(){ 
     //I would need this 
     string valueOfMyCustomFieldOnForm = xyz.Text; //example 

     int count = 500; 
     for(int i = 0; i < 500; i++){ 
      //do something here 
      OnProgressChanged(...); //call event, GUI is updated 
     } 
     OnCompleted(...); //migration completed 
    } 
} 

次に、この名前空間のすべてのクラスをドロップダウンリストに置きます。リスト内で1つを選択して[開始]をクリックすると、Runメソッドのコード付きスレッドが開始されます。

DB Host: TEXTBOX 
DB Username: TEXTBOX 
DB Password: TEXTBOX 
-- 
Migrator custom field 1: TEXTBOX 
Migrator custom field 2: TEXTBOX 
... 
-- 
List with migrated items - irrelevant 

(データベースホスト、ユーザー名などのように)GUIにはほとんど共通フィールドがありません。しかし、これらの移行担当者の中には、GUI上にカスタムフィールドが必要なものがあります(たとえば、3つの余分なテキストボックスフィールド)。 WPFでこれを行う最善の方法は何ですか?私は動的であるためにGUIの一部が必要です。

答えて

2

あなたの質問には、WPFでメタデータ駆動型UIを作成するためのメカニズムに関する多くの一見無関係な情報があります。この問題にアプローチする方法は次のとおりです。

プロパティシートのようなUIを構築したいとします。プロンプトと入力コントロールを使用して、プロパティごとに行を表示するグリッドです。これを行うには、オブジェクトのコレクションが必要になります。コレクション内の各アイテムには、プロパティとその値を記述するプロパティが含まれます。シンプルなデザインは、PromptプロパティとValueプロパティを公開し、変更通知を実装するクラスです。

あなたが作成され、このコレクションを埋めていたら、あなたはグリッドに表示ItemsControlを実装することができます

<ItemsControl ItemsSource="{Binding Properties}" Grid.IsSharedSizeScope="True"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate DataType="PropertyViewModel"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition SharedSizeGroup="Prompt"/> 
       <ColumnDefinition SharedSizeGroup="Value"/>     
      </Grid.ColumnDefinition> 
      <Grid.RowDefinitions> 
       <RowDefinition/> 
      </Grid.RowDefinitions> 
     </Grid> 
     <Label Content="{Binding Prompt}"/> 
     <TextBox Grid.Column="1" Text="{Binding Value, Mode=TwoWay}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

これは非常に簡単です - すべてのように、それについての最も複雑な事はGrid.IsSharedSizeScopeを使用していますこのコントロールが作成するグリッドは同じ列幅を使用します。 ItemsControlの代わりにListViewを使用することもできますが、これにはListViewを使用すると、処理したくないフォーカスと選択を囲む問題が発生します。本物のプロパティシートのように行います - ので、WPFのテンプレートマッチングである魔法の、あなたはおそらくobjectとしてValueプロパティを実装し、Value財産の異なる可能なタイプを処理するために別のテンプレートを作成することができることを

は注意してください。これを行うには、あなたがタイプごとにテンプレートを作成したい、例えば:

<DataTemplate DataType="{x:Type System:String}"> 
    <TextBox Text="{Binding Value, Mode=TwoWay}"/> 
</DataTemplate> 
<DataTemplate DataType="{x:Type System:DateTime}"> 
    <DatePicker Value="{Binding Value, Mode=TwoWay}"/> 
</DataTemplate> 

などが次にあなたがそうする代わりにTextBoxValueを示すのPropertyViewModelためのテンプレートを変更したい、それがContentPresenterを使用しています例えば、

<ContentPresenter Grid.Column="1" Content="{Binding}"/>