2016-05-09 2 views
0

私はいくつかの質問があり、答えを探すのに苦労しています。MVVMを使用してViewModel - C#を変更するときに関数を実行します。

1:私は、アプリケーションが終了するたびに関数を呼び出すようにしなければなりません。終了ボタンをクリックして何かをします。

Q2:私はViewModelに制御を行うシェルのviewmodelでmenuitemcontrolを持っていますが、私はいくつかのWebサービス要求を行うが、想像し、それらを作成する上で、私は私がどのようにすることができます、のviewmodelで要求を更新することを要求された友人を削除私は他のビューモデルからこの呼び出しを行いますか?

EDIT:シナリオ - HomeViewModelとFriendsViewModelが含まれている ShellViewModel、私は私がホームを再度実行するWebサービスから情報を取得する機能をクリックしたときにすることを私はしたいFriendsViewModelで友人を受け入れました。 (私がやっていた場合は、コードビハインド私はにOnclick [ホーム]> runlogin()を使用します)

UpdateQ2:

public FriendsViewModel() 
    { 
     MessengerInstance.Register<NotificationMessage>(this, NotifyMe); 
     au = AuthSingleton.Instance.getAuthUser(); // Singleton that works like a session in the desktop App. 
     if (AuthSingleton.Instance.IsAuth == true) 
      loadFriends(); 
    } 
    public void NotifyMe(NotificationMessage notificationMessage) 
    { 
     string notification = notificationMessage.Notification; 
     //do your work 
     loadFriends(); 
    } 
    #endregion constructors 

    public async void loadFriends() 
    { 

     var response = await CommunicationWebServices.GetASM(au.idUser + "/friends", au.token); 
     var fh = JsonConvert.DeserializeObject<FriendsHandler>(response); 
    } 

私が送信するためにコメンターのユーザーからの提案を使用することにしましたこれと第二のViewModelからのメッセージは、(かなりクールと簡単な解決策)を再度実行するためのアップデートを注文するが、を何とか私のシングルトンが削除されているので、それはを動作しません:Oメッセージが送信され

MessengerInstance.Send(new NotificationMessage("notification message"));

よろしくお願いいたします。

+0

あなたはICommands/RelayCommandsを考えましたか?UIからViewModelにこれらのコマンドを起動し、viewmodelに実際のWebサービスロジックを処理させることができます。 – aggietech

+0

@aggietech私がそれをすればどこでコマンドを呼び出すべきですか?そしてどのビューモデルからですか?シェル(別のビューモデルを含む)? – Antoine

+0

Ok - IoC(または何らかのコンテナ)を使用してビューモデルを登録している場合は、そのビューモデルの現在のインスタンスを取得することでそれらを参照できるはずです – aggietech

答えて

1

Q1 - どのMVVMフレームワークをお使いですか?私が知っているすべてのMVVMフレームワークはカスタムコマンド(別名RelayCommands/DelegatingCommands)を実装しているので、それらをWindowイベントにアタッチすることができます。もう1つの解決策は、ViewModelにClosingRequestイベントの実装を持たせることです。

public class BaseViewModel 
{ 
    public event EventHandler ClosingRequest; 

    protected void OnClosingRequest() 
    { 
     if (this.ClosingRequest != null) 
     { 
      this.ClosingRequest(this, EventArgs.Empty); 
     } 
    } 
} 

だから、あなたのビューでは、あなたが持っているでしょう:

public partial class MainWindow: Window 
{ 
    ... 
    var vm = new BaseViewModel(); 
    this.Datacontext = vm; 
    vm.ClosingRequest += (sender, e) => this.Close(); 
} 

あなたはMVVMライトを使用している場合、あなたはあなたのViewModelにに次の操作を実行できます。

public ICommand CmdWindowClosing 
    { 
     get 
     { 
      return new RelayCommand<CancelEventArgs>(
       (args) =>{ 
        }); 
     } 
    } 

このような何かあなたのウィンドウで:

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="Closing"> 
     <command:EventToCommand Command="{Binding CmdWindowClosing}" PassEventArgsToCommand="True" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

Q2 - MVVMフレームワークを使用すると、これも簡単です。それらのほとんどはMessage Mediatorパターンを実装しています。あなたのためにこれが何を意味します。これは、 "Request needs update"という警告メッセージを送信することができ、受信者がそのメッセージにバインドして、メッセージを受信したときに何かを実装することを意味します。 Microsoftのdemoを見てください

+0

私はMVVM Lightを使用しています。あなたの例ではコードビハインドを使用していますが、私はそのようなアプローチを使用したくありません。同じようなことをすることは可能ですか? Q2:いいアイデア、私はその可能性を完全に忘れてしまった。驚くばかり。 – Antoine

+0

私は自分の答えを更新しました。それがあなたを助けたら、+1投票してください: – quicoli

+0

私はセッションをエミュレートするためにシングルトンを使っています。しかし、私がメッセージを送信し、メソッドが再び実行されると、シングルトンは空ですか?どうやって?私はどこでも削除していません。もし私がコメントにメッセージを入れたら、アプリはスムーズに実行されます。 – Antoine

関連する問題