使用不同的数据类型创建集合并绑定到列表
问题描述:
我想创建一个具有不同数据类型的集合,以绑定到Silverlight和C#中的列表框控件。使用不同的数据类型创建集合并绑定到列表
这是可能的,如果每个数据类型实现的接口?例如,我有单独的对象“小提琴”,“吉他”和“鼓”,每个实现“IMusicalInstrument”界面。然后,我可以创建一个列表,将其绑定到列表框,或者将“小提琴”,“吉他”和“鼓”对象添加到列表中?
答
为了澄清一件事,因为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 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的数据绑定应该是强类型。但我似乎在那里的少数。只要不是,像这样利用它就没有问题。