2012-01-27 38 views
0

我正在处理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> 

如果有另一段代码可能会使用,我也可以稍后添加它。

+0

原因去除UserControl将最有可能成为你的一些代码。如果你分享它,答案_might_会变得更具体。 – Nuffin 2012-01-27 11:45:57

+0

我也想过这个。但我不确定我应该在这里粘贴哪些代码。我已更新原始帖子。 – Sentropie 2012-01-27 12:10:42

回答

0

为什么你将CustomLine控件包装在UserControl标签中?

我最好的猜测是UserControl告诉ListBox项目是不正确的大小,所以ListBox只加载它认为是可见的项目。这是因为ListBox的默认行为是使用UI虚拟化,因此它只呈现可见的控件,而滚动ListBox将重新使用现有控件并替换它们后面的DataContext,而不是创建新控件。

尝试在ItemTemplate

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

谢谢,那就是重点!我使用了'UserControl'标签,因为我以这种方式学习了 - 显然是错误的。谢谢你的解释。 – Sentropie 2012-01-27 15:25:54