1

私はSilverlightを初めて使用しますが、より中級/上級のもののいくつかに耳を傾けています。

Silverlight5でMVVMを使用しています。

ビューがあります(これをComboView.xamlと呼びます)。ViewModelがあります(これをAwesomeVMと呼びます)

ビューには、次のようにページのリソースで宣言されたViewModelが含まれています。

<local:AwesomeVM x:Key="MyAwesomeVM" />

次に、次のようにDataContextで参照されます。

<sdk:Page.DataContext>
    <Binding Source="{StaticResource MyAwesomeVM}"/>
</sdk:Page.DataContext>

ビューのコードビハインドには、SetupPageというメソッドがあります。SetupPageは、次のように、そのビューモデルタイプ(AwesomeVM)のインスタンスをパラメーターとして取り込みます。

Public Sub SetupPage(ByVal VM As AwesomeVM)
    ...
End Sub

ここで問題があります。ViewModel内からこのSetupPage()を呼び出す必要があります。ViewModelがデータを取得する前にページをロードしているようです(これは、ViewModelが非同期呼び出しであるWCF Webサービスを使用しているためだと思います)。そのため、SetupPage()のVMにはデータがありません。そして爆破します。

ViewModel内からビューのメソッドを呼び出す方法はありますか?

4

1 に答える 1

1

ええ..そうしないでください。まず第一に、ページはそのデータ コンテキストを認識しているため、そのメソッドにデータ コンテキストを渡す必要はありません。第二に、そのメソッドをビューモデルに配置できず、それをビューに含める必要がある場合 (おそらくビューを直接操作するため)、直接呼び出さないでください。それを分離し、メッセージングを使用してそれを完了します。

ほとんどの MVVM フレームワーク (MVVM Light など) は、あるコンポーネントから別のコンポーネントにメソッドを呼び出すことができる軽量のメッセージング プラットフォームを提供します。たとえば、MVVM Light の場合:

ページの分離コードで:

Messenger.Default.Register<SetupPageMessage>(this, SetupPage);

次に、ViewModel で次のようにします。

Messenger.Default.Send(new SetupPageMessage());

コードビハインドで SetupPage メソッドを実行します。これを完全に接続するにはもう少しセットアップが必要です (SetupPageMes​​sage クラスを作成し、適切にパラメーター化された SetupPage メソッドをコードに作成するなど)。

于 2012-04-30T14:41:04.253 に答える