0

ボタンをクリックすると、GalaSoft.MvvmLight.Messaging メッセージが、メッセージ レシーバーが登録されているすべての viewModel でトリガーされます。データの新しいリストが非同期に取得され、UI の更新に使用されます。UIは更新されますが、次を呼び出すと

var contentControls = VisualTreeQueryHelper.FindChildrenOfType(this).ToList();

画面上のビジュアル リストが正しい場合でも、古いリストのコンテンツ カウントとインデックスが反映されます。これにより、インデックスとリスト サイズを使用してフォーカスを設定するフォーカス ロジックが壊れます。

ビューから離れて戻ってくると、contentControls リストが修正されます。

private IList<CoreViewModel> itemViewModels;
public IList<CoreViewModel> ItemViewModels
{
    get { return this.itemViewModels; }
    set
    {
        this.itemViewModels = value;
        RaisePropertyChanged("ItemViewModels");
    }
}

 public static IEnumerable<T> FindChildrenOfType<T>(DependencyObject objectInParentTreeToStartFrom)
    where T : DependencyObject
{
    List<T> list = new List<T>();

    FindChildrenOfTypeImpl<T>(objectInParentTreeToStartFrom, list);

    return list;
}

private static void FindChildrenOfTypeImpl<T>(DependencyObject objectInParentTreeToStartFrom, List<T> list)
    where T : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(objectInParentTreeToStartFrom); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(objectInParentTreeToStartFrom, i);

        if (child is T)
        {
            list.Add(child as T);
        }
        else
        {
            FindChildrenOfTypeImpl(child, list);    
        }
    }
}
4

0 に答える 0