2

我正在使用 MVVM Light Toolkit。我找不到任何 Messenger 或 Notification 类来发送空消息。

视图模型1:

 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();                     
        }
    }

视图模型2:

Ctor:

Messenger.Default.Register(this, CreateAnotherTimeTable); 

private void CreateAnotherTimeTable()
{

}

我只需要向另一个 ViewModel 发送通知,根本不发送数据。

MVVM Light Toolkit 库有可能吗?

4

4 回答 4

2

除非我误解了某些东西,否则您不能通过 Messenger 创建和发送自定义“信号消息”类型来完成此操作吗?

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。

一旦您对消息传递更加熟悉,您将能够使用更多属性,以便接收者可以回调发送者以返回状态或一些数据。寻找代表和 lambda 函数来实现这一点。

这一切都是为了避免将代码放在关闭子窗口的代码后面!:-) 使用你认为合适的。

干杯。马里奥

于 2011-01-04T20:36:03.440 回答
1

真的没有办法做到这一点,并且在某种程度上违背了信使类的观点。我不想写你做错事的帖子,但我觉得我被困住了。messenger 类的工作方式是你有两个订阅相同概念的各方,它是一个观察者模型。如果没有类似的概念或信息,就真的无法将这两个对象联系在一起。通用消息,无论是简单字符串还是自定义消息,都充当订阅和发布类的交汇点。

如果 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 回答