Listbox не может показать все содержимое своих элементов - PullRequest
0 голосов
/ 27 января 2012

Я работаю над программой на 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>

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

1 Ответ

0 голосов
/ 27 января 2012

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

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

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

<ListBox.ItemTemplate>
    <DataTemplate>
        <local:CustomLine />
    </DataTemplate>
</ListBox.ItemTemplate>
...