澄清一件事,因为 Silverlight 数据绑定不是强类型的,所以列表中的各个项目不需要都支持公共接口。如果他们这样做,这可能是一个更好的设计,但他们实际上需要做的就是支持您将绑定到的属性。如果你想变得花哨,你可以将你的数据模板分成不同的部分,每个部分都是为不同的类设计的,然后隐藏不适用于正在显示的特定项目的部分。因此,您可以为鼓、吉他、小提琴等提供完全不同的界面。例如,假设您的乐器是这样定义的:
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:
<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 用于显示它。每个 TextBlock 的可见性通过 InstrumentVisibilityConverter 控制,如下所示:
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();
}
}
然后用这样的代码实例化它(或者你想要的):
List<object> instruments = new List<object>
{
new Guitar(),
new Guitar(),
new Violin(),
new Violin(),
new Drum()
};
instrumentsListBox.ItemsSource = instruments;
现在,我个人认为(参见here)Silverlight 数据绑定应该是强类型的。但我似乎是那里的少数。只要不是,这样利用它就没有问题。