2012-02-28 2 views
4

가상화를 사용할 수있는 ListView 컨트롤에 이상한 문제가 있습니다. 문제를 재현하기 위해 아주 작은 파일럿 앱을 만들었습니다. 목록보기에서 몇 개의 텍스트 상자에 대해 뭔가를 입력 한 다음 아래로 스크롤하면 몇 페이지 후에 입력 된 값이 아래의 수정되지 않은 텍스트 상자에서 반복됩니다. 어떤 옵션이 있습니까 http://kepfeltoltes.hu/120228/Capture1_www.kepfeltoltes.hu_.pngListView 가상화 값을 재활용 모드에서 반복합니다.

:

<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; } 
    } 
} 

그리고 문제에 대한 화면 캡처 여기

는 윈도우의 XAML입니다 이 문제를 해결하려면? 나는 이것이 재활용 모드와 관련이 있다고 생각하지만 정상적인 행동이 아니어야한다고 생각합니다. 사전에

감사합니다,

이스트 반 확실히 이상한 효과, 그러나 그것 뿐이다 인해 재활용 모드 플러스 사실 당신은 아무것도에 TextBox.Text 속성을 바인딩하지 않을에 보인다

답변

1

.

이 같은 코드 (이름 변경에 대한 유감을) 변경

모두 잘해야한다 : 당신의 대답에 대한

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}"/> 
+0

감사합니다. 코드가 제대로 실행되기 때문에 모든 것을 컨트롤에 바인딩 한 경우에만 재활용 모드를 사용할 수 있습니다. – kexx