1

次の xaml を検討してください。

<UserControl>
    <Grid x:Name="UiRoot"/>
</UserControl>

ここで、ViewModel にビューへの参照があります (Caliburn.Micro OnViewLoaded から)。次に、ビューに UiRoot という名前のグリッドがあるかどうかを判断する必要があります。

protected override void OnViewLoaded(object view) {
        base.OnViewLoaded(view);
    //Does the view have a UiRoot?
}

このコードは実際には ViewModelBase にあり、View に UiRoot がある場合とない場合があります。ビューが存在する場合に、ビューを動的に作成するために使用されます。

私が最初に考えたのは、IHasUiRoot インターフェイスを作成し、分離コードに配置することでした。次に、それを IHasUiRoot にキャストできます。これは機能しますが、それ以外の場合は空のコードビハインドがあるため、そのままにして、リフレクションまたはその他の方法で実行したいと思います。最後に、コントロールを動的に追加するには、実際のコントロールへの参照が必要です。

4

2 に答える 2

0

簡単に考えてみると、ViewModel の View に一種の依存関係を追加しています。

これを解決する 1 つの方法は、コードをビューに移動することです。それ自体を調べて、コントロールの UiRoot を指すように (依存関係) プロパティを設定します。

ViewModel では、同様のプロパティを追加して、これらをビュー コードにバインドできます。

このようにして、View 依存コードを追加せずに、ViewModel でプロパティをチェック/使用できます。

于 2013-06-28T11:16:34.683 に答える