2017-06-24 5 views
1

データビューアとしてバインドされている2つのプロパティを持つ比較的複雑なUserControlを持つリストビューがあります。仮想化はバインドされたプロパティを台無しにしているようです。

ItemsPanelは以下の通りです:

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

私のリストビューは、一般的に、しかし私は非常に大きな問題に実行している、約70項目が含まれています

私はその後、約30項目をスクロールアップし、すべての時間を戻って、プロパティが混乱しているように見える、それらのいくつかは、アイテムのプロパティを上に切り替えているようだ。例えば

、前Iは、以下であった場合:ダウンバックアップスクロールした後= 3

  • プロパティA = 1
  • プロパティA = 2
  • プロパティAを私は持っているでしょう:

    • プロパティA = 1
    • プロパティA = 2
    • プロパティA = 1

    どのように私は、アイテムのいずれかがそのプロパティを維持するか、それらを正しくリロードすることを確認することができますか?

+0

の多くの大規模なユーザーコントロール上で、非常に混乱し得ることができますか?あなたは[MCVE]プロジェクトを持っていませんでした私たちの側でテストするために? –

+0

私はこの問題を再現できません。 @ SunteenWu-MSFTは言ったように - あなたはMCVEを提供するべきである(あなたはそれで問題を特定する可能性が高い)。 – Grx70

答えて

0

最後にこれを修正する方法を知りました。他の誰かが同様の問題に遭遇している場合、PropertyChangedイベントを処理していないか、またはヌルである可能性があります。例えば、これは、リストビューのDataTemplateを内部ユーザーコントロールの場合:

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

そして、それはこのように処理されている。今までそれならば、

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

仮想化はCustomControlをリサイクルすることたびにif(instance.CustomText != "")のテキストブロックが更新されず、古いプロパティが再度表示されるため、空の文字列にバインドされています。 OnPropertyChangedが何らかの理由で呼び出されない場合も同じことが起こります。

それは、この特定の状況ではな種類の愚かなようだが、それはあなたが仮想化を防ぐ場合、結果は何のプロパティとサブプロパティ

関連する問題