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データバインディングは、に厳密に入力する必要があります。しかし、私は少数派にいるようです。そして、そうでない限り、このようにそれを利用することに問題はありません。