2

Fooオブジェクトを含むListBoxがあり、いくつかのイベントに基づいて、ListBoxのListBoxItemsを無効/有効にします。ListBox.Itemsプロパティを使用して、Fooオブジェクトを見つけました。理解したことから、FooのListBoxItemコンテナーを取得するには、次の関数を使用する必要があります。正しい?

foreach (var item in Items)
{
    var lbi = ItemContainerGenerator.ContainerFromItem(foo) as ListBoxItem;
    // do something
}

実際、私はListBoxを継承し、それに追加のプロパティを追加するカスタムコントロールFilteringListBoxを持っています。上記のコードは、カスタムコントロールの背後にあるコード内にあり、FilteringListBoxの作成が完了すると正常に機能します。ただし、私の問題は、いくつかのプロパティがバインドされているときにこれを実行しようとすることです。プロパティFilteringCollectionと、これがバインドされたときにトリガーされるPropertyCallbackがあります。このコールバックでは、FilteringCollectionを保存しますが、最初のフィルタリングも実行します。つまり、setコレクションを実行し、FilteringCollectionにあるFooを表すListBoxItemを無効にします。

これは私が問題を抱えるところです。すべてのFooを見つけたので、ItemsSourceが設定されていることを確認しましたが、ItemContainerGenerator.ContainerFromItemを実行するとnullになります。ListBoxItemsがまだ作成されていないようです。そうじゃない?これが私のバインディングです:

<custom:FilteringListBox ItemsSource="{Binding AvailableFoos}" FilteringCollection="{Binding AlreadyIncludedFoos}"></custom:FilteringListBox>

それで; どちらか:「バインド時」にListBoxItemsを取得するにはどうすればよいですか?または-私ができない場合; ListBoxがListBoxItemsの作成を完了したことを通知するオーバーライド可能なイベントはありますか?運がなくてInitializedを試してみました...

4

2 に答える 2

1

実際、より良い解決策はItemContainerGeneratorを使用することのようです。作成時にイベントハンドラーを接続します。

ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;

そして、イベントハンドラーに必要なことを実行させます。

protected void ItemContainerGenerator_StatusChanged(object sender, System.EventArgs e)
{
    if (ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
        EvaluateInitialElements(); 
}
于 2010-09-12T20:40:16.180 に答える
0

イベントOnRenderは、コンポーネントをレンダリングする準備ができたときにトリガーされるため、ListBoxItemが作成されます。このイベントでフィルタリングの初期処理を行うことで、必要なものがすべて準備できているように見えます。要素を評価して無効にしてから、レンダリングをトリガーします。

protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
{
    EvaluateInitialElements();
    base.OnRender(drawingContext);
}
于 2010-09-09T08:23:08.493 に答える