2

MVVM Light Toolkit を使用しています。空のメッセージを送信する Messenger または Notification クラスの Ctor が見つかりませんでした。

ViewModel1:

 private int _selectedWeeklyRotation;
    public int SelectedWeeklyRotation
    {
        get { return _selectedWeeklyRotation; }
        set
        { 
            if(_selectedWeeklyRotation == value)
                return;

            _selectedWeeklyRotation = value;
            this.OnPropertyChanged("SelectedWeeklyRotation");
            if(value > 1)
                Messenger.Default.Send();                     
        }
    }

ViewModel2:

Ctor:

Messenger.Default.Register(this, CreateAnotherTimeTable); 

private void CreateAnotherTimeTable()
{

}

通知を別のViewModelに送信するだけで、データはまったく送信されません。

MVVM Light Toolkit ライブラリでそれは可能ですか?

4

4 に答える 4

2

私が何か誤解していない限り、メッセンジャーを介してカスタムの「シグナル メッセージ」タイプを作成して送信することで、これを達成できませんか?

public class WeeklyRotationSignal {}

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

次に、別のビュー モデルに登録します。

Messenger.Default.Register<WeeklyRotationSignal>(this, msg => doWork);
于 2010-12-30T21:34:18.723 に答える
2

文字列タグを使用して単純なメッセージを送信し、文字列タグを一致させることでそのメッセージを受信できます。このようなもの:

おそらくViewModel1.csのような場所にあるコードの送信者部分

Messenger.Default.Send<string>("Dummy text message", "String_ToHelpMatchTheMsg");

上記のメッセージに応答するコードの最後の部分を受信して​​おり、ViewModel2.cs などの他のファイルにある可能性があります
...

Messenger.Default.Register<string>(this, "String_ToHelpMatchTheMsg", executeThisFunction);

private void executeThisFunction(string strMsg)
{
   //your code would go here to run upon receiving the message
   // The following line will display: "Dummy text message" 
   System.Windows.Browser.HtmlPage.Window.Alert("msg passed: " + strMsg); 
}

上記のメッセージ コードで渡されるテキスト メッセージに対して何もする必要がないことに注意してください。コードの一部がコードの別の部分に ping を送信して、他のセクションにコードを実行するように依頼します。重要な文字列は、「String_ToHelpMatchTheMsg」を使用した文字列です。これは、送信者と受信者を照合するために使用されるキーであるためです。独自の準イベントを作成するのとほとんど同じように、Send メソッドが実行されると、Register メソッドが通知され、独自の関数を起動して実行することもできます。

これを子ウィンドウの閉じるボタンと一緒に使用して閉じました。子ウィンドウのビューの [閉じる] ボタンは、その childWindowViewModel のリレー コマンドにバインドされます。そのリレー コマンドには、ParentViewModel にメッセージを送信する上記のコードがあります。ParentViewModel の Register 部分は、parentViewModel から最初にインスタンス化された ChildWindow を閉じるメソッドを起動することによって、そのメッセージに応答します。

メッセージングに慣れると、受信者が送信者にコールバックしてステータスやデータを返すことができるように、使用できる属性がさらに増えます。これを実現するには、デリゲートとラムダ関数を探します。

これはすべて、コード ビハインドにコードを配置して子ウィンドウを閉じることを避けるためです。:-) 必要に応じて使用してください。

乾杯。マリオ

于 2011-01-04T20:36:03.440 に答える
1

これを達成する方法は実際にはなく、メッセンジャークラスの要点に反することもあります。私はあなたの間違った投稿を書きたくありませんでしたが、私は行き詰まっていると感じています. メッセンジャー クラスが機能する方法は、同じ概念、つまりオブザーバー モデルにサブスクライブする 2 つの当事者が存在することです。このようなコンセプトやメッセージがなければ、2 つのオブジェクトを結びつける方法はありません。サブスクライブ クラスとパブリッシング クラスのミーティング ポイントとして機能する単純な文字列またはカスタム メッセージのいずれかの一般的なメッセージ。

ViewModel パブリッシングが ViewModel のタイプを認識している場合、その ViewModel に送信しようとしている可能性があります...

Messenger.Default.Send<Type>(typeof(ViewModelToSendTo);

これは非常に単純な対話ポイントとして機能し、カスタム クラスを作成する必要もありません。パブリッシングクラスをサブスクライバーに結合するため、一部の純粋主義者はこのアプローチに問題を抱えている可能性があります。

于 2010-06-05T02:34:01.987 に答える
0

それが可能だとは思いませんし、率直に言って、そのようなメッセージを出す意味がわかりません。文字列「SelectedWeeklyRotation」を送信することもできます。ブロードキャスト メッセージとアプリケーションの受信者の数を増やすと、何らかの意味を持つ空のメッセージが表示されるのは奇妙に思えます。

私が使用している MVVM Light のバージョンでは、空のメッセージを送信することさえできません。

ただし、ViewModelBase に次のようなメソッドがありました。

// Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
RaisePropertyChanged(MyPropertyPropertyName, oldValue, value, true);

これはあなたにとって興味深いかもしれません。

于 2010-06-02T09:32:25.820 に答える