【问题标题】:Create a Collection with different Data Types and Bind to a List创建具有不同数据类型的集合并绑定到列表
【发布时间】:2011-06-12 19:18:09
【问题描述】:

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

如果每种数据类型都实现一个接口,这可能吗?

例如,我有单独的对象“Violin”、“Guitar”和“Drums”,每个对象都实现了“IMusicalInstrument”接口。然后我可以创建一个列表,将其绑定到列表框,然后将“小提琴”、“吉他”和“鼓”对象添加到该列表中吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    然后使用instrumentsListBox.DataSource = instruments;

    然而如果你想让自己更容易,告诉他们实现DisplayMemberValueMember的属性,这就是ListBox用来决定显示什么和当您选择某些内容时用作值。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-07
        • 1970-01-01
        • 2016-01-25
        • 2019-12-31
        • 2013-02-05
        • 2020-06-10
        • 1970-01-01
        相关资源
        最近更新 更多