2011-01-20 8 views
3

SilverlightとC#のリストボックスコントロールにバインドするために、異なるデータ型を持つコレクションを作成しようとしています。異なるデータ型を持つコレクションを作成してリストにバインドする

それぞれのデータ型がインターフェイスを実装している場合は可能ですか?

たとえば、 "IMusicalInstrument"インターフェースを実装する "Violin"、 "Guitar"、 "Drums"といったオブジェクトがあります。リストを作成し、それをリストボックスにバインドし、代わりに "Violin"、 "Guitar"、 "Drums"オブジェクトをそのリストに追加できますか?

答えて

5

はい、Genericのリストを使用して、List<T>をご覧ください。 、

var instruments = new List<IMusicalInstrument> { 
    new Drum(), 
    new Guitar(), 
    new Violin() 
} 

、その後、あなた自身のためにそれが簡単に作成したい場合は、DisplayMemberValueMemberのプロパティを実装するためにそれらを教えてしかしinstrumentsListBox.DataSource = instruments;

を使用する:あなたはこのようないくつかの楽器でリストを作成することができますこれは、ListBoxが、何を選択したときに何を表示して値として使用するかを決定するために使用するものです。

0

Silverlightデータバインディングは強く型付けされていないため、リスト内のさまざまな項目がすべて共通のインターフェイスをサポートする必要はありません。そうした方が優れた設計ですが、実際に行う必要があるのは、バインドするプロパティをサポートすることだけです。また、あなたが気になるようにするには、データ・テンプレートを異なるクラスに分割し、それぞれが異なるクラス用に設計され、表示されている特定の項目に適用されない部分を隠すことができます。あなたはこのように見えたのListBoxを作成することができ

public class Drum 
{ 
    public int DrummerCount { get; set; } 
} 

public class Violin 
{ 
    public int ViolinistCount { get; set; } 
} 

public class Guitar 
{ 
    public int GuitaristCount { get; set; } 
} 

:あなたはたとえばなどドラム、ギター、バイオリンのための完全に異なるインタフェースを持つことができそれでは、あなたの楽器は次のように定義されていたとしましょう

<ListBox x:Name="instrumentsListBox"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <TextBlock 
         Visibility="{Binding Converter={StaticResource instrumentVisibilityConverter}, ConverterParameter=Drum}" 
         Text="{Binding DrummerCount, StringFormat=Drummers:\{0\}, Converter={StaticResource debugConverter}}"/> 
        <TextBlock 
         Visibility="{Binding Converter={StaticResource instrumentVisibilityConverter}, ConverterParameter=Violin}" 
         Text="{Binding ViolinistCount, StringFormat=Violinists:\{0\}, Converter={StaticResource debugConverter}}"/> 
        <TextBlock 
         Visibility="{Binding Converter={StaticResource instrumentVisibilityConverter}, ConverterParameter=Guitar}" 
         Text="{Binding GuitaristCount, StringFormat=Guitarists:\{0\}, Converter={StaticResource debugConverter}}"/> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

各クラスには、それを表示するために使用される個別のTextBlockがどのようにあるかに注意してください。

public class InstrumentVisibilityConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string expectedType = parameter as string; 
     if (value.GetType().Name == expectedType) 
     { 
      return Visibility.Visible; 
     } 
     else 
     { 
      return Visibility.Collapsed; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

そして、このようなコードでそれをインスタンス化(または、しかし、あなたがしたい):各テキストブロックの視認性は、このようになりますInstrumentVisibilityConverterを介して制御される

List<object> instruments = new List<object> 
    { 
     new Guitar(), 
     new Guitar(), 
     new Violin(), 
     new Violin(), 
     new Drum() 
    }; 
instrumentsListBox.ItemsSource = instruments; 

を今、私は個人的に(と思いますhereを参照してください)、Silverlightデータバインディングは、に厳密に入力する必要があります。しかし、私は少数派にいるようです。そして、そうでない限り、このようにそれを利用することに問題はありません。

関連する問題