2011-09-11 18 views
3

私のSilverlightアプリケーションでいくつかのコントロールを動的に生成したいと思います。MVVMのパターンに従って動的にコントロールを作成する

public class CustomProperty 
{ 
    public CustomDataType DataType { get; set; } //enum:integer, string, datetime, etc 
    public object Value { get; set; } 
    public string DisplayName { get; set; } 
    public string Mappings { get; set; } // Simulating enums' behavior. 
} 
  • は最高何ですか:

    public class TestClass 
    { 
        [Display(Name="First Name")] 
        public string FirstName { get; set; } 
    
        [Display(Name = "Last Name")] 
        public string LastName { get; set; } 
    
        public List<CustomProperty> CustomProperties { get; set; } 
    } 
    

    各「CustomProperty」ついにテキストボックス、チェックボックスやコンボボックスは次のようになります。
    をより明確にするために、ここで私のクラスの単純化された定義ですMVVMパターンを使用してこれを実装する方法は? ViewModelでCustomPropertiesを解析して、どのコントロールを作成するかを調べると、MVVMパターンに基づいてビュー内に新しいコントロールを作成するにはどうすればいいですか?

  • UIを高速化するのに役立つ銀色のコントロールはありますか?

  • プログラムでデータ注釈を定義できますか?たとえば、カスタムプロパティを解析した後、プロパティにデータアノテーション(Display、Validation)を追加し、DataForm、PropertyGrid、またはこのような状況のための便利なコントロールにバインドできますか?

ありがとうございます。

+1

最初の質問については、私の答え[ここ](http://stackoverflow.com/questions/5267905/wpf-mvvm-creating-dynamic-controls/5267964#5267964)を参照してください。 Silverlightの代わりにWPFですが、そのままそのまま適用することができます。 – Jon

+0

@ジョン:リンクありがとう。私は明日それを実装しようとします。データのテンプレート(双方向バインディングのようなもの)もデータテンプレートで更新することは可能ですか? – Kamyar

+0

確かに、それはオブジェクトのビジュアルツリーを指定するより柔軟な方法です。ハードコードされていれば、同じことをすることができます。 – Jon

答えて

3

このような場合は、通常、ItemsControl(たとえばListBox)またはItemsControlを継承するコントロールのいずれかを使用します。 ItemsControlから継承したコントロールでは、コレクション内の各アイテムのテンプレートを定義できます。 (あなたはビューモデルを通して、あなたのTestClassへのアクセスを得たと仮定して)あなたのサンプルを使用して:

<ListBox ItemsSource="{Binding TestClass.CustomProperties }"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <!--DataContext is stet to item in the ItemsSource (of type CustomProperty)--> 
      <StackPanel> 
       <TextBlock Text="{Binding DisplayName}"/> 
       <TextBox Text="{Binding Value}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

このコードは、あなたのCustomPropertiesコレクション内の各CustonPropertyのラベルとテキストボックスが含まれているListBoxを作成します。