如何在WPF中将列表列表绑定到列表框?

时间:2019-05-14 20:33:25

标签: c# wpf binding

我在C#中有一个列表列表,其中每个列表包含3个整数

List<List<int>> Data = new List<List<int>>();
data.Add(new List<int>{ 1, 2, 3});

现在在WPF中,我有一个要将这些值绑定到的列表框。下面的代码是我现在拥有的代码,但是正如预期的那样,它表示没有“ Item”属性。

<ListBox ItemsSource="{Binding Data}" HorizontalContentAlignment="Stretch">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
          <RowDefinition Height="auto" />
        </Grid.RowDefinitions>

        <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Item1}" />
        <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Item2}" />
        <TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding Item3}" />
      </Grid>
    </DataTemplate>
  </ListBox>

有人可以解释一下我要做什么才能使这些数字显示在列表框中?

谢谢。

3 个答案:

答案 0 :(得分:3)

您需要在ListView项模板中为绑定编制索引,如下所示:

<ListBox ItemsSource="{Binding Data}" HorizontalContentAlignment="Stretch">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
          <RowDefinition Height="auto" />
        </Grid.RowDefinitions>

        <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding [0]}" />
        <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding [1]}" />
        <TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding [2]}" />
      </Grid>
   </DataTemplate>
</ListBox>

但是,如果您计划在每个List<int>中具有动态数量的元素,则可以在原始ListView中放置另一个ListView

此外,如果您遇到绑定路径问题,此链接:https://web.archive.org/web/20120814100526/http://msdn.microsoft.com/en-us/library/ms742451.aspx真的很方便!

答案 1 :(得分:1)

您需要像这样执行TextBlock行:

<TextBlock Grid.Row="0"
           Grid.Column="0"
           Text="{Binding Path=[0]}" />
<TextBlock Grid.Row="0"
           Grid.Column="1"
           Text="{Binding Path=[1]}" />
<TextBlock Grid.Row="0"
           Grid.Column="2"
           Text="{Binding Path=[2]}" />

答案 2 :(得分:1)

如果您的内部列表始终包含3个项目,我建议您为绑定创建模型。像-

    public class TripleIntObject
    {
        public int First { get; set; } 
        public int Second{ get; set; }
        public int Third{ get; set; }
    }

,但希望您的属性具有更多含义。

因此您的列表从List<List<int>>变为List<TripleIntObject>

然后相应地修改您的TextBlocks-

<TextBlock Grid.Row="0"
           Grid.Column="0"
           Text="{Binding First}" />
<TextBlock Grid.Row="0"
           Grid.Column="1"
           Text="{Binding Second}" />
<TextBlock Grid.Row="0"
           Grid.Column="2"
           Text="{Binding Third}" />

如果您计划使用动态项目,我还建议从List<TripleIntObject>更改为“ ObservableCollection”,以便在任何数据更改时通知您的视图。您可以阅读更多here