4

Caliburn.MicroWhiteを使用している WPF アプリケーションの UI 自動化テストを作成しようとしています。CM の組み込み規則を使用して、コントロールをビュー モデルのプロパティとメソッドにバインドしています。また、Conductorクラスを使用して、1 つの画面に複数のビューを表示できるようにしています。これは通常、画面上の複数のコントロールが同じx:Name値になる可能性があることを意味します。別のビューモデルにバインドされるだけです。私がやろうとしていることの良いアイデアは、 CM に付属の HelloScreens サンプル アプリケーションで見ることができます。

私が直面している問題はx:Name、CM がすべてのバインディング作業を処理できるように、同じ属性を持つ複数の XAML 要素を持つことです。残念ながら、これは、複数のUIItemオブジェクトが同じ UI オートメーション ID を持つことを意味します。たとえば、さまざまTextBlockな要素を取得するために私が見つけた唯一の方法x:Name="DisplayName"は、次のような呼び出しを行うことです。

SearchCriteria criteria = SearchCriteria.ByAutomationId("DisplayName").AndIndex(1);
WPFLabel label = myWindow.Get<WPFLabel>(criteria);

これは、私のテストでは、さまざまなコントロールが画面に配置される正確な順序を知る必要があることを意味しますが、これは非常に脆いようです。別のビュー モデルを追加するだけで、テストがすべて壊れていることがわかります。

  • x:Name属性を使用する以外にオートメーション ID を指定する方法はありますか?
  • White を使用する代わりに UI オートメーション フレームワークを直接使用した場合、これはより簡単になりますか?
  • それとも、CM の規約ベースのバインドをやめて、すべてに固有のx:Name値を与えて手動でバインドする必要がありますか?

更新しました

一度に複数のビューを表示することの意味を明確にするために、ここに私の一般的なレイアウトを示します。私は私ShellViewModelが由来するものを持っていConductor<IScreen>.Collection.OneActiveます。次に、私のビューにはItemsControl、シェル ビュー モデルのItemsプロパティにバインドされた があります。各項目テンプレートには、シェルのビューにある にIScreen特定のものをロードするためのボタンが表示されます。ContentControlしたがって、 で要素を検索しようとするとx:Name="DisplayName"、シェル ビューにラベルがあり、 ボタンにItemsControlラベルがあり、 の中にラベルがありContentControlます。

4

2 に答える 2

1

1つのオプションは、タイプのBindPropertiesBindActionsデリゲートを変更ViewModelBinderして、それらが属するビューに基づいて名前が変更されたコントロール名を操作することです。

たとえば、オプションで、他のビューで名前が重複している可能性のある各コントロールにプレフィックスとしてビュー名を追加できます。だからDisplayName、、、になる可能性がListViewDisplayNameありContentViewDisplayNameます。

コントロールの処理を続行する前に、コントロール名から「表示」という単語までのテキストを削除して、クリーンなコントロール名を形成することができます。

于 2011-04-04T21:51:34.640 に答える