我正在尝试使用不同的数据类型创建一个集合,以绑定到Silverlight和C#中的列表框控件。
如果每种数据类型实现一个接口,这是否可行?
例如,我有单独的对象" Violin"," Guitar"和" Drums&#34 ;,每个都实现" IMusicalInstrument&#34 ;接口。然后,我可以创建一个List,将其绑定到列表框,或者添加" Violin"," Guitar"," Drums"该列表的对象?
答案 0 :(得分:5)
是的,您可以使用Generic列表查看List<T>
。您可以使用以下某些工具创建列表:
var instruments = new List<IMusicalInstrument> {
new Drum(),
new Guitar(),
new Violin()
}
然后使用instrumentsListBox.DataSource = instruments;
然而如果您想让自己轻松一点,请告诉他们实施DisplayMember
和ValueMember
的属性,这就是ListBox
使用的内容当你选择某事时,要阻止展示和使用的价值。
答案 1 :(得分:0)
为了澄清一件事,因为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数据绑定应该是强类型的。但我似乎在那里少数。只要不是这样,利用它就没有问题。