2017-06-24 4 views
1

Ich habe eine ListView, die als Datatemplate ein relativ komplexes UserControl mit einigen Eigenschaften hat, die an es gebunden werden.Virtualisierung scheint die binded Eigenschaften zu verwirren

Die Itemspanel ist die folgende:

<ListView.ItemsPanel> 
    <ItemsPanelTemplate> 
      <ItemsStackPanel VerticalAlignment="Bottom" ItemsUpdatingScrollMode="KeepLastItemInView"/> 
     </ItemsPanelTemplate> 
</ListView.ItemsPanel> 

Meine Listenansicht enthält in der Regel etwa 70 Einzelteile, aber ich laufe in ein ganz wichtiges Thema:

Jedes Mal, wenn ich etwa 30 Artikel nach oben und dann zurückgehen, die Eigenschaften scheinen durcheinander gekommen zu sein, und einige von ihnen scheinen mit den Eigenschaften der höher gelegenen Elemente gewechselt zu haben.

Wenn zum Beispiel, bevor ich hatte die folgende:

  • Eigenschaft A = 1
  • Eigenschaft A = 2
  • Eigenschaft A = 3

Nach oben scrollen und wieder nach unten Ich hätte:

  • Eigenschaft A = 1
  • Eigenschaft A = 2
  • Eigenschaft A = 1

Wie kann ich sicherstellen, dass die Gegenstände entweder ihre Eigenschaften behalten oder sie richtig nachladen?

+0

bekommt Was das Ergebnis ist, wenn Sie die Virtualisierung verhindern? Haben Sie einen haben [MCVE] Projekt zum Testen auf unserer Seite? –

+0

Ich kann dieses Problem nicht reproduzieren. Wie @ SunteenWu-MSFT gesagt hat - Sie sollten einen MCVE bereitstellen (Sie werden das Problem wahrscheinlich genau dort lokalisieren). – Grx70

Antwort

0

Endlich habe ich herausgefunden, wie das zu beheben ist: Wenn jemand in ein ähnliches Problem auftritt, liegt es möglicherweise daran, dass Sie das PropertyChanged-Ereignis behandeln, ohne Eigenschaften zurückzusetzen, die fehlen oder null sind. Zum Beispiel ist, wenn dies der Usercontrol in der Datatemplate einer Listenansicht:

<local:CustomControl CustomText={Binding text}/>

Und es so gehandhabt wird:

public string CustomText   
    { 
     get { return (string)GetValue(CustomTextProperty); } 
     set { SetValue(CustomTextProperty, value); } 
    } 
    public static readonly DependencyProperty CustomTextProperty = DependencyProperty.Register(
     nameof(CustomText), 
     typeof(string), 
     typeof(CustomControl), 
     new PropertyMetadata(string.Empty, OnPropertyChanged)); 

    private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var instance = d as CustomControl; 
     if(instance.CustomText != "") 
      myTextBlock.Text = instance.CustomText; 
    } 

Jedes Mal, dass Virtualisierung eines Custom rezykliert, wenn überhaupt es wird an eine leere Zeichenfolge gebunden, wegen der if(instance.CustomText != "") wird der Textblock nicht aktualisiert, und alte Eigenschaften werden wieder angezeigt. Das gleiche passiert, wenn OnPropertyChanged aus irgendeinem Grund nie aufgerufen wird.

Es scheint in dieser besonderen Situation ziemlich blöd, aber es kann sehr verwirrend auf große Benutzersteuerelementen mit vielen Eigenschaften und Subproperties