一連のデータをグリッドに表示する必要があるシナリオがありますが、データグリッドを使用できないほど複雑な方法で列グループと行グループを使用しています。行 A、B、C にセクション グループがあり、垂直列グループ c1 と c2 があります。また、このコントロールの 2 つのバージョンが表示される場合があります。
A は最大 5 つまで存在できます。各 A は最大 5 つの B を持つことができ、各 B は 8 つの C を持ち、各 C は c1 に 5 つのプロパティ、c2 に 5 つのプロパティを持ちます。
これらの B のそれぞれは、C のラベルを出力し、次に c1 のそのラベルのすべての値を出力し、次に c2 の下のそのラベルのすべてのプロパティを出力します。
各 C は、グリッドの外側にある不確定なチェックボックスで制御して、非表示、表示、または強調表示できます。
私が抱えている問題は、5番目のAの周りで、その下にあるすべてのCがチェックボックスへのバインディングを失い始めることです(相対バインディングを介してバインドされています)。
バインディングの評価を単純に停止するように、プロパティをバインドできる回数に制限はありますか? 各 C には独自のチェックボックスがあり、それらはすべてほぼ同時に表示されます。それはすべてItemsControlであるため、最後の反復にあります-最初の4回から何も変更されず、すべてが完了しました。これはコントロールの5回目の反復です。
処理するものが少なくなるように C の 1 つを削除すると、問題はなくなります。別のものを追加すると、問題は以前に発生します。
ここで話していることを示す簡単なイメージを作成しました
。 C のいずれかを強調表示または非表示にできることに注意してください。しかし、ある時点を過ぎると、強調表示と非表示が単純に停止するという問題が発生します。エラー、例外、出力ウィンドウには何も表示されません。バインディングは単に評価されなくなります。
更新:
限界があるようです。次の xaml を使用してテストする場合:
<ItemsControl ItemsSource="{Binding TestCollection}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Index}" Visibility="{Binding DataContext.TestVisibility, RelativeSource={RelativeSource AncestorType=navigation:Page}}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
ビューモデルに次のように入力します。
List<TestModelObject> initList = new List<TestModelObject>();
for (int i = 0; i < 15000; i++)
{
initList.Add(new TestModelObject(i));
}
TestCollection = new ObservableCollection<TestModelObject>(initList);
ViewModel で TestVisibility を false に設定します。UI に 15K の項目を一度に追加するのに少し時間がかかるため、実行して処理させた後、ItemsControl の整数が 9640 前後から始まるリストを取得します。実行時間に基づいていますか?
これを Silverlight 5 と Silverlight 4 の両方でテストしました。Silverlight 4 では、もちろん RelativeBinding の回避策を使用しましたが、結果は同じでした。