TPTB は、アプリを 1 つのウィンドウで実行する必要があると判断しました。モーダル モードで新しいウィンドウをポップアップすることは許可されていません。
そして当然のことながら、あらゆる場所にモーダル ダイアログをポップアップ表示する UI デザインがあります。
そこで、最上位のグリッドをウィンドウに追加しました。そのグリッドでは、行も列も定義していないため、すべてが行 0/列 0 に描画されます。
グリッドの最初の要素は、ウィンドウに通常表示されるすべてのものを含む別のグリッドでした。2 つ目は、グレーの半透明の背景を持つフルサイズの Border です。残りは、ポップアップとして表示する必要があるさまざまな UserControls を含む、広いマージンと白い背景を持つ Borders でした。最初を除くすべてが Visibility="Collapsed" でした。
そして、ポップアップを表示する必要があるときは、灰色の背景と適切な UserControl に Visibility="Visible" を設定します。その結果、うまく機能する素晴らしいシャドーボックス効果が得られました。
ポップアップがポップアップを表示できるようにする必要があると誰かが判断するまで。予測不可能な順序で。
Grid で Visibility="Collapsed" 要素を使用して実装したメソッドの制限は、それらの順序が固定されていることでした。UserControlB は、UserControlA の表示を要求したのが UserControlB であっても、常に UserControlA の上に表示されます。そして、それは受け入れられません。
そこで私の次の試みは、Window.Resources でさまざまな UserControls を定義し、それらをコードで Grid に追加することでした。
this.masterGrid.Children.Add(this.Resources["userControlA"] as UserControlA);
そして、それはほとんど機能します。しかし、バインディングはすべてめちゃくちゃです。
例として、コントロールの 1 つは、ウィンドウのビューモデルのメンバー オブジェクト内のコレクションの CurrentItem にプロパティをバインドすることになっています。コントロールをグリッドで非表示のアイテムとして定義すると、正常に機能しました。しかし、それをリソースとして定義したとき、プロパティは null で、バインドされませんでした。
グリッドに追加した後、コードでバインドしてみました。
userControlA.SetBinding(UserControlA.myProperty, new Binding()
{ Source = this.viewModel.myCollection.CurrentItem });
そして、それは問題なくコンパイルおよび実行されますが、正しいオブジェクトにバインドしていません。
初めて UserControl を表示すると、適切なオブジェクトがバインドされていることがわかります。しかし、それを閉じて、コレクション内の CurrentItem を別のオブジェクトに移動し、UserControl を再度表示すると、最初のオブジェクトがバインドされていることがわかります。もう一度閉じて 3 回目に開くと、正しいオブジェクトがコントロールにバインドされていることがわかります。
コードをチェックインしましたが、バインドしている CurrentItem は毎回正しいのですが、1 回おきにかかるようです。
だから私は最初に明示的にバインディングをクリアしようとしました:
BindingOperations.ClearBinding(userControlA, UserControlA.myProperty);
userControlA.SetBinding(UserControlA.myProperty, new Binding()
{ Source = this.viewModel.myCollection.CurrentItem });
しかし、それは何の違いもなかったようです。
全体として、かなり単純なはずの問題を解決するために、私はうさぎの穴を駆け下り、複雑さをどんどん深く追い求めているように感じます。
次のことについて何か提案はありますか?
- 動的に追加された要素でバインディングを機能させる方法、または
- 動的に順序付けされた要素を使用せずに、シャドーボックスとして任意に順序付けされたポップアップを表示する方法は?
前もって感謝します。