使用MVVM工具包灯发送空消息或通知

时间:2010-05-31 20:19:39

标签: mvvm mvvm-light

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

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 个答案:

答案 0 :(得分:2)

除非我误解了某些内容,否则你不能通过Messenger创建和发送自定义“信号消息”类型来实现这一目标吗?

public class WeeklyRotationSignal {}

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

然后在另一个视图模型中注册:

Messenger.Default.Register<WeeklyRotationSignal>(this, msg => doWork);

答案 1 :(得分: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上的中继命令。该relay命令具有上面的代码,以向ParentViewModel发送消息。 ParentViewModel上的Register部分通过触发一个关闭ChildWindow的方法来响应该消息,该方法最初是从该parentViewModel中即时显示的。

一旦您更熟悉消息传递,您就可以使用更多属性,以便接收方可以回叫发送方以提供状态或某些数据。寻找代理和lambda函数来实现这一目标。

这一切都是为了避免在后面的代码中放置代码来关闭子窗口! :-) 根据需要使用。

干杯。 马里奥

答案 2 :(得分:1)

实际上没有办法实现这一点,并且在某种程度上违背了信使类的观点。我不想写你做错了帖子,但我觉得我被卡住了。信使类的工作方式是你有两个订阅同一个概念的方,它是一个观察者模型。没有类似的概念或消息,实际上没有办法将两个对象联系在一起。简单字符串或自定义消息是否作为订阅和发布类的会合点的通用消息。

如果ViewModel发布知道它试图发送给它的ViewModel的类型可能......

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

这将作为一个非常简单的交互点,您也不必创建自定义类。一些纯粹主义者可能会遇到这种方法的问题,因为它将出版物与订阅者联系起来。

答案 3 :(得分:0)

我不认为这是可能的,坦率地说,我没有看到有这种信息的意义。您也可以发送一个字符串“SelectedWeeklyRotation”。当您增加广播消息的数量 - 以及应用程序中的接收器时,有一条具有某种意义的空消息似乎很奇怪。

在我正在使用的MVVM Light版本中,甚至无法发送空消息。

但是我确实在ViewModelBase中看到了一个方法:

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

这可能对您有用。