Как связать список списков со списком в WPF? - PullRequest
1 голос
/ 14 мая 2019

У меня есть список списков в 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 ]

3 голосов
/ 14 мая 2019

Вам нужно будет индексировать свои привязки в шаблоне элемента 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 голос
/ 14 мая 2019

Если ваш внутренний список ВСЕГДА будет содержать 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, чтобы ваше представление получало уведомление при любых изменениях данных. Вы можете прочитать больше здесь .

1 голос
/ 14 мая 2019

Вам нужно сделать строки 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]}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...