7

MVVM パターンを使用して WPF アプリケーションのプロトタイプを作成しています。この質問への回答に続いて、ModelProviderServiceモデルをプロパティとして公開する を設定しました。サービスの消費者はビューモデルです。つまり、モデルを自分でインスタンス化するのではなく、サービスからモデルを引き出します。

class ModelProviderService {

  private LoginModel loginModel;
  public LoginModel LoginModel {
    get { return loginModel; }
    set { loginModel = value; }
  }

  private ProjectsModel projectsModel;
  public ProjectsModel ProjectsModel {
    get { return projectsModel; }
    set { projectsModel = value; }
  }

  public ModelProviderService() {
    loginModel = new LoginModel();
    projectsModel = new ProjectsModel();
  }    
}

さて、次のことが起こります。

  • ビューモデルは、プロパティなどのプロパティを変更しLoginModelます。
  • ビューモデルは、そのプロパティを設定することにより、モデル プロパティをサービスにプッシュします。modelService.LoginModel.MyProperty = localLoginModel.MyProperty;
  • このサービスは、「私のタイプのモデルがLoginModel変更されました」というメッセージを発行します。
  • このメッセージを購読している他のビューモデルは、この変更されたモデルをサービスからプルします。

どうすれば実装できますか:

  1. 「ブロードキャストメッセージ」?
  2. メッセージへのサブスクリプション?
4

2 に答える 2

4

MessageBusまたはを使用しEventAggregatorて、弱参照を使用してサブスクライバーにメッセージを公開できます。私の実装(またはNuGetパッケージ)を見てください。

HandleOnUIThreadAttributeまた、メソッドにを適用することで、メッセージ処理をUIスレッドにマーシャリングすることもできます(UIコンポーネントを更新する必要がある場合)Handle

あなたの場合の使用法は次のようになります:

// The message
public class LoginModelChanged
{
    public LoginModelChanged(LoginModel model)
    {
        Model = model;
    }

    public LoginModel Model { get; private set; }
}

// Service that publishes messages
public class ModelProviderService
{
    private IMessageBus _messageBus;
    private LoginModel _loginModel;

    public ModelProviderService(IMessageBus messageBus)
    {
        _messageBus = messageBus;
    }

    public LoginModel LoginModel
    {
        get { return _loginModel; }
        set
        {
            _loginModel = value;
            _messageBus.Publish(new LoginModelChanged(value));
        }
    }
}

// Subscribing ViewModel
public class SomeViewModel : IHandle<LoginModelChanged>
{
    public SomeViewModel(IMessageBus messageBus)
    {
        messageBus.Subscribe(this);
    }

    public void Handle(LoginModelChanged message)
    {
        // Do something with message.Model
    }
}

内部の仕組みとこれを実装する方法について詳しく知りたい場合は、GitHubリポジトリのソースコードを確認してください。好きなようにコードを自由に使用してください:)

于 2013-01-18T09:09:46.323 に答える
3

WPF アプリケーション内でメッセージを配信する場合は、 prismフレームワークのEventAggregatorを使用できます。

EventAggregator を使用すると、viewmodel はイベントに弱くサブスクライブでき、送信者に関する知識は必要ありません。これにより、コンポーネントまたはモジュール全体にメッセージを簡単に配布できます。

于 2013-01-18T09:06:42.463 に答える