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

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

问题描述:

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

这是可能的,如果每个数据类型实现的接口?例如,我有单独的对象“小提琴”,“吉他”和“鼓”,每个实现“IMusicalInstrument”界面。然后,我可以创建一个列表,将其绑定到列表框,或者将“小提琴”,“吉他”和“鼓”对象添加到列表中?

是的,你可以通过使用列表Generic看看List<T>。您可以创建一个列表,像这样一些工具:

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

然后用instrumentsListBox.DataSource = instruments;

但是,如果你想很容易让自己,告诉他们实施DisplayMemberValueMember属性,这是什么ListBox用来阻止什么显示和使用作为价值,当你选择的东西。

为了澄清一件事,因为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的数据绑定应该是强类型。但我似乎在那里的少数。只要不是,像这样利用它就没有问题。