1

次のように、ItemsSource にバインドする ListBox があります。

var foos = new ObservableCollection<Foo> { foo1, foo2, foo3 };
var listBox = new ListBox { ItemsSource = _foos };

アイテムを保持する ListBoxItems ですぐにいくつかの操作を実行したいのですが、すぐには作成されないようです。彼らは?通知を受けるためにリッスンできるイベントはありますか、または単に ListBoxItem を無効な方法で取得しようとしていますか? 私はこのようにしています(そして、ListBoxが「準備ができている」ことがわかっている場所で動作することを確認しました):

var lbi = listBox.ItemContainerGenerator.ContainerFromItem(foo1) as ListBoxItem;

これは単体テストで行われていることに注意してください。そのため、ListBox がレンダリングされることはないと思います。それが ListBoxItems が作成されない理由ですか? ListBoxItems の作成を何らかの方法で手動でトリガーできますか?

4

1 に答える 1

3

アイテムの作成は非同期で行われ、パネルによってはまったく作成されない場合があります (仮想化)。お探しのイベントは ですItemContainerGenerator.StatusChangedSOでそれをグーグル検索すると、多くの例が見つかります。ただし、アイテムを直接検索して操作するのは複雑になる可能性があります。

これは、アイテムの作成について詳しく説明している非常に優れた記事です。祖先-articleも探してください。

ところで:MVVMパターンを見ることをお勧めします。それを学習するのに少し時間がかかりますが (WPF を学習する時間とは比較になりません)、多くの時間を節約できます。ここには、すばらしい出発点となる Jason Dolinger のビデオへのリンクがあります。

アップデート:

コメントで約束したように、ここではビジュアル ツリーを検索する関数 (仮想化がオフの場合のみ使用可能)。

void FindChildFrameworkElementsOfType<T>(DependencyObject parent,IList<T> list) where T: FrameworkElement{             
    DependencyObject child; 
    for(int i=0;i< VisualTreeHelper.GetChildrenCount(parent);i++){             
        child = VisualTreeHelper.GetChild(parent, i); 
        if (child is T) { 
            list.Add((T)child); 
        } 
        FindChildFrameworkElementsOfType<T>(child,list); 
    } 
} 
于 2010-09-10T08:14:32.483 に答える