Значение виртуализации ListView, повторяющееся в режиме переработки
У меня странная проблема с включенной виртуализацией элемента управления 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
Есть ли возможность решить эту проблему? Я думаю, что это связано с режимом переработки, но я думаю, что это не должно быть нормальным поведением.
Заранее спасибо,
Иштван
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}"/>