【问题标题】:Send a empty Message or Notification with MVVM toolkit light使用 MVVM 工具包灯发送空消息或通知
【发布时间】:2011-02-26 02:40:08
【问题描述】:

我正在使用 MVVM Light Toolkit。我找不到任何 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 库可以做到吗?

【问题讨论】:

  • erhm...工具包的作者在这里提供他的服务?

标签: mvvm mvvm-light


【解决方案1】:

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

public class WeeklyRotationSignal {}

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

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

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

【讨论】:

    【解决方案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 函数来实现这一点。

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

    干杯。 马里奥

    【讨论】:

      【解决方案3】:

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

      如果 ViewModel 发布知道它尝试发送给它的 ViewModel 的类型,则可以...

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

      这将作为一个非常简单的交互点,您也不必创建自定义类。一些纯粹主义者可能对这种方法有疑问,因为它将发布类与订阅者耦合。

      【讨论】:

        【解决方案4】:

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

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

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

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

        您可能对此感兴趣。

        【讨论】:

        • @karinp 看起来很有趣,您找到该方法的任何示例了吗?我找不到有关该事件使用的任何信息/示例项目。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多