Привязка к коллекции Viewmodel внутри ItemTemplate

Я новичок в этом, так что терпите меня.

У меня есть модель представления и представление с ItemsControl, в котором уже есть некоторые данные, с собственным источником элементов.

Однако я фактически хочу пронумеровать элементы в элементе управления, потому что их всегда 10. Я мог бы сделать это, просто добавив множество текстовых блоков вдоль левой стороны, но это просто утомительно, и я пытаюсь найти другой способ.

Итак, суть того, что у меня есть на данный момент:

<ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition />
                                <ColumnDefinition />
                                <ColumnDefinition />
                            </Grid.ColumnDefinitions>
                            <TextBlock Grid.Column="0" Text="{Binding RelativeSource={RelativeSource AncestorType=ItemsControl}, Path=DataContext.Nums}" />
                            <TextBlock Grid.Column="1" Text="{Binding Item1}" />
                            <TextBlock Grid.Column="2" Text="{Binding Item2}" />
                        </Grid>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>

Моя проблема в том, что, конечно, он просто отображает один и тот же элемент для каждого из них, который в данном случае «(Коллекция)», потому что у меня есть свойство списка с 1-10 в нем.

Привязка к этому в отдельном файле .cs:

private List<int> _nums = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

public List<int> Nums
{
    get { return _nums; }
}

ИЗМЕНИТЬ:

Поэтому я нашел решение, создав новое свойство в источнике элементов, которое было строкой, а затем, немного повозившись с тем, как мое приложение собирает исходные данные, я смог заставить его работать последовательно.

Мне все еще интересно, сработал бы ли этот метод, однако, на мой взгляд, работы было бы намного меньше.


person pgwri    schedule 04.10.2013    source источник
comment
Можете ли вы показать структуру класса, который вы связываете?   -  person Anand Murali    schedule 04.10.2013
comment
Фактический источник элементов находится в свойстве в моей модели представления, в основном я просто пытаюсь использовать второе свойство в качестве источника?   -  person pgwri    schedule 04.10.2013
comment
TextBlock не поддерживает шаблоны (в том виде, в каком вы на него ссылаетесь). На основании того, что вы написали, сразу же предлагается заменить первый TextBlock на MyUserControl.   -  person Gayot Fow    schedule 04.10.2013
comment
Могу я познакомить вас с методом Enumerable.Range? Это очень удобно: List<int> _nums = Enumerable.Range(1, 10).ToList();. Очевидно, что это более полезно с большими диапазонами.   -  person Sheridan    schedule 04.10.2013
comment
Интересно, на самом деле вообще не использовал Linq, спасибо за совет!   -  person pgwri    schedule 04.10.2013


Ответы (1)


На мой взгляд, проще всего просто добавить свойство int в ваш тип данных или класс модели представления данных, а затем Bind непосредственно в ваш ItemTemplate:

<DataTemplate>
    <StackPanel Orientation="Horizontal">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" Text="{Binding Number}" />
            <TextBlock Grid.Column="1" Text="{Binding Item1}" />
            <TextBlock Grid.Column="2" Text="{Binding Item2}" />
        </Grid>
    </StackPanel>
</DataTemplate>

В WPF мы обычно пытаемся создать класс модели представления для каждого представления, содержащего все данные, которые нам нужно отобразить.

ОБНОВЛЕНИЕ >>>

Не обращайте внимания на числа, которые могут или не могут быть связаны с данными... просто добавьте свойство int Number и оставьте его равным 0, когда вы заполняете другие свойства данными. Когда вы передаете данные в модель представления, просто перебирайте их, правильно нумеруя. Предполагая, что ваша коллекция называется Items, вы можете сделать это:

for (int index = 1; index < Items.Count; index++)
{
    Items[index - 1].Number = index;
}
person Sheridan    schedule 04.10.2013
comment
Для меня это сложно из-за характера данных, которые я использую. Первоначально это было так. Я импортирую файлы, в которых есть числа, но в некоторых случаях в файле есть только 2–6, и я получаю список из 10, где пустые слоты имеют 0, я экспериментировал с преобразованием их в символы/строки, поэтому я мог бы иметь пробел вместо 0, но затем я перешел к попытке таким образом. В основном я просто изучаю/экспериментирую с разными вариантами, мне просто интересно, можно ли сделать эту работу - person pgwri; 04.10.2013