1

数日前、私はこの質問をしましたが、答えは私をさらに混乱させました。だから私はもっと簡単な質問をします:

(私はCaliburn.Microを使用しています。これはWPFアプリです)。子としてAView/AViewModelとBView/BViewModelを持つMainView/MainViewModelがあるとします。MainViewはグリッドであり、ユーザーの選択に応じて、AViewまたはBViewのいずれかを入力するセルの1つです。AViewのみを表示したい場合は、次のようにします。

MainViewの場合:

<StackPanel Name="SP_Controls" VerticalAlignment="Bottom" Grid.Row="1" Grid.Column="0">
    <ContentControl Name="ViewModelToShow" Margin="10" />
</StackPanel> 

およびMainViewModel内:

public AViewModel ViewModelToShow{get; set;}

私の素朴なアイデアは、次のようなことをすることです。

private AViewModel _AVM;
private BViewModel _BVM;

public ... ViewModelToShow{ get; set;}

次に、コードで、たとえば、viewmodelを次のように設定します。

ViewModelToShow = _BVM; 

各ViewModelは異なるクラスであるため、私の唯一の問題は「...」です。ジェネリックでこれを行う方法はありますか、それともキャスト先のViewModelの基本クラスを定義する必要がありますか?しかし、そうしても、正しく表示されますか?ありがとう。

4

3 に答える 3

6

PropertyChangedBaseモデルは、、またはから継承する必要がありますScreenScreenから継承しPropertyChangedBase、も実装しIScreenます。Screenライフサイクルを追加します(つまりOnActivateなど)。

次に、アプローチを使用できます。つまりCurrentViewModel、タイプがであるegというパブリックプロパティを使用できますIScreen。その後、必要に応じて適切なビューモデルに設定できます。UIを正しく更新する場合は、参照が変更されたときにこのCurrentViewModelプロパティをセッターで呼び出す必要があることに注意してください。NotifyOfPropertyChange

または、親ビューモデルを2つの子ビューモデルのコンダクターと見なし、組み込みのCaliburn.MicroConductorタイプを使用することもできます。たとえば、から派生しConductor<IScreen>.Collection.OneActiveます。

次に、2つの子ビューモデルを親のItemsコレクションに追加し、ActivateItemメソッドを呼び出して現在のビューモデルを設定できます。次に、ビューを更新ContentControlしてのx:Nameを作成しActiveItemます。

詳細については、こちらをご覧ください。

于 2012-11-02T21:31:17.533 に答える
1

上記の答えはすべて正しいです。ビューの場所がどのように機能するかという点では、プロパティの種類は重要ではありません。インスタンスのランタイムタイプのみが重要です。したがって、プロパティをオブジェクト型として定義することもできますが、それでも機能します。プロパティが変更通知を発行することを確認してください。Conductorの場合、ActiveItemがそれを処理します。

于 2012-11-03T10:42:52.387 に答える
1

私は通常、ViewModelBaseクラスから継承します。そのクラスには、すべてのプロパティ変更ビットとボブが含まれています。ただし、ビューのDataContextプロパティは単なるオブジェクトであるため、タイプはそれほど重要ではありません。

于 2012-11-03T10:49:17.700 に答える