Listbox не может показать все содержимое своих элементов

Я работаю над программой C # / WPF и создал пользовательский элемент управления, состоящий из двух текстовых полей (и сетки).

В моем главном окне есть список. Его источником элементов является коллекция моих упомянутых пользовательских элементов управления. Когда я заполняю его и отлаживаю программу, она содержит 20 элементов, и все элементы содержат текст, как я хотел. Но после загрузки главного окна (и заполнения списка) в нем отображаются все элементы, но только девять из них имеют текстовые поля с текстом. У других есть текстовые поля без текста.

В чем может быть причина этого?

Обновление: вот код.

Пользовательский элемент управления:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="40" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <TextBox x:Name="NumberColumn" x:FieldModifier="public" Text="{Binding LineNumber}"
             Grid.Column="0" HorizontalAlignment="Right" />
    <TextBox x:Name="TextColumn" x:FieldModifier="public" Text="{Binding Text}"
             Grid.Column="1" HorizontalAlignment="Left" />            
</Grid>

Заполнение списка:

string line;
Collection<CustomLine> lines = new Collection<CustomLine>();
StreamReader reader = new StreamReader(@"2008.sln");
while ((line = reader.ReadLine()) != null)
{
    CustomLine myLine = new CustomLine(line, lines.Count + 1);
    lines.Add(myLine);
}

this.leftListBox.ItemsSource = lines;

XAML списка:

<ListBox x:Name="leftListBox" Grid.Column="0" Margin="10"
             MouseDown="leftListBox_MouseDown" SelectionChanged="leftListBox_SelectionChanged">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <UserControl>
                    <local:CustomLine />
                </UserControl>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

Если там может использоваться другой фрагмент кода, я тоже могу добавить его позже.


person Sentropie    schedule 27.01.2012    source источник
comment
Причина, скорее всего, будет в вашем коде. Если вы поделитесь им, ответы могут стать более конкретными.   -  person Nuffin    schedule 27.01.2012
comment
Я тоже думал об этом. Но я не был уверен, какие фрагменты кода мне следует здесь вставить. Я обновил исходный пост.   -  person Sentropie    schedule 27.01.2012


Ответы (1)


Почему вы заключили свой CustomLine элемент управления в тег UserControl?

Я предполагаю, что UserControl сообщает ListBox, что элементы имеют неправильный размер, поэтому ListBox загружает только те элементы, которые, по его мнению, являются видимыми. Это связано с тем, что по умолчанию ListBox использует виртуализацию пользовательского интерфейса, поэтому он отображает только видимые элементы управления, а при прокрутке ListBox повторно используются существующие элементы управления и заменяется DataContext за ними вместо создания новых элементов управления.

Попробуйте удалить UserControl в ItemTemplate

<ListBox.ItemTemplate>
    <DataTemplate>
        <local:CustomLine />
    </DataTemplate>
</ListBox.ItemTemplate>
person Rachel    schedule 27.01.2012
comment
Спасибо, в том-то и дело! Я использовал теги UserControl, потому что узнал их таким образом - очевидно, неправильно. Спасибо и за объяснение. - person Sentropie; 27.01.2012