启用虚拟化的ListView控件存在一个奇怪的问题。我创建了一个非常小的试用版应用程序来重现这个问题。当我在列表视图中为几个文本框键入内容然后向下滚动时,在几页之后,键入的值将在下面未触动的文本框中重复。
这是窗口的XAML:
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid Name="mainGrid">
<ListView ItemsSource="{Binding Path=DemoList}" >
<VirtualizingStackPanel.IsVirtualizing>
True
</VirtualizingStackPanel.IsVirtualizing>
<VirtualizingStackPanel.VirtualizationMode>
Recycling
</VirtualizingStackPanel.VirtualizationMode>
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBox MinHeight="20" MinWidth="200" Margin="4"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Window>
代码隐藏:
namespace WpfApplication3
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
demolist a = new demolist();
mainGrid.DataContext = a;
}
}
public class demolist
{
public demolist()
{
DemoList = new List<string>();
for (int i = 0; i <= 5000; i++)
{
DemoList.Add("sss");
}
}
public List<string> DemoList { get; set; }
}
}
关于此问题的屏幕截图: http://kepfeltoltes.hu/120228/Capture1_www.kepfeltoltes.hu_.png
有没有解决此问题的方法?我想这与回收模式有关,但我认为这不应该是正常行为。
提前致谢,
的István
答案 0 :(得分:1)
这肯定是一个奇怪的效果,但它似乎是由于回收模式加上你没有将TextBox.Text属性绑定到任何东西的事实。
像这样更改您的代码(抱歉更改名称),一切都应该很好:
public class RecyclingListViewModel
{
public RecyclingListViewModel()
{
Items = new List<DataItem>();
for (int i = 0; i <= 5000; i++)
{
Items.Add(new DataItem{Id = i, Name = i.ToString(CultureInfo.InvariantCulture)});
}
}
public List<DataItem> Items { get; set; }
}
public class DataItem
{
public int Id { get; set; }
public string Name { get; set; }
}
<ListView ItemsSource="{Binding Path=Items}" >
<TextBox MinHeight="20" MinWidth="200" Margin="4" Text="{Binding Name}"/>