创建具有不同数据类型的集合并绑定到列表

时间:2011-01-20 22:18:30

标签: c# silverlight data-binding data-structures listbox

我正在尝试使用不同的数据类型创建一个集合,以绑定到Silverlight和C#中的列表框控件。

如果每种数据类型实现一个接口,这是否可行?

例如,我有单独的对象" Violin"," Guitar"和" Drums&#34 ;,每个都实现" IMusicalInstrument&#34 ;接口。然后,我可以创建一个List,将其绑定到列表框,或者添加" Violin"," Guitar"," Drums"该列表的对象?

2 个答案:

答案 0 :(得分:5)

是的,您可以使用Generic列表查看List<T>。您可以使用以下某些工具创建列表:

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

然后使用instrumentsListBox.DataSource = instruments;

然而如果您想让自己轻松一点,请告诉他们实施DisplayMemberValueMember的属性,这就是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数据绑定应该是强类型的。但我似乎在那里少数。只要不是这样,利用它就没有问题。