MVVM Light Messenger的使用

MVVM Light Messenger的使用

参见文章:https://msdn.microsoft.com/zh-cn/magazine/dn745866.aspx

MVVM Light Messenger 旨在通过简单的前提来精简此场景:任何对象都可以是接收端;任何对象都可以是发送端;任何对象都可以是消息。

使用如下:

1.使用默认的 Messenger 并检查发送端

public class FirstViewModel
 { 
    public FirstViewModel()
    { 
        Messenger.Default.Register<NotificationMessage>( this, message => 
        {
            if (message.Sender is MainViewModel) 
            { // 此消息是要发送给我。 
            } 
        }); 
    }
} 
    
public class SecondViewModel 
{ 
    public SecondViewModel() 
    { 
        Messenger.Default.Register<NotificationMessage>( this, message => 
        { 
            if (message.Sender is SettingsViewModel) 
            { // 此消息是要发送给我 
            } 
        }); 
    }
}

 

2.专用消息

public class MainViewModel 
{ 
    private Messenger _privateMessenger;
    public MainViewModel() 
    { 
        _privateMessenger = new Messenger(); 
        SimpleIoc.Default.Register(() => _privateMessenger, "PrivateMessenger"); 
    }
    public void Update() 
    { 
        _privateMessenger.Send(new NotificationMessage("DoSomething"));
    } 
} 
public class FirstViewModel 
{ 
    public FirstViewModel() 
    { 
        var messenger = SimpleIoc.Default.GetInstance<Messenger>("PrivateMessenger"); 
        messenger.Register<NotificationMessage>( this, message => 
     { // 此消息是要发送给我。
     });
} }

3. 使用令牌的不同信道

public class MainViewModel 
{ 
    public static readonly Guid Token = Guid.NewGuid(); 
    public void Update() 
    { 
        Messenger.Default.Send(new NotificationMessage("DoSomething"), Token); 
    } 
} 

public class FirstViewModel 
{ 
    public FirstViewModel() 
    { 
        Messenger.Default.Register<NotificationMessage>( this, MainViewModel.Token, message => 
        { // 此消息是要发送给我。
         }); 
    } 
}

4. 使用消息类型来定义上下文

public class Sender 
{ 
    public void SendBoolean() 
    { 
        Messenger.Default.Send(true); 
    }
    public void SendNotification() 
    { 
        Messenger.Default.Send( new NotificationMessage<bool>(true, Notifications.PlayPause)); 
    } 
}

public class Receiver
{ 
    public Receiver() 
    { 
        Messenger.Default.Register<bool>( this, b => 
        { // 不确定如何处理此布尔。
        }); 
        Messenger.Default.Register<NotificationMessage<bool>>( this, message => 
        { 
            if (message.Notification == Notifications.PlayPause) 
            { // 对消息执行某操作。
                Content.Debug.WriteLine(message.Notification + ":"+ message.Content); 
            } 
        }); 
    } 
}

5. 发送 PropertyChangedMessage

public class BankViewModel :ViewModelBase 
{ 
    public const string BalancePropertyName = "Balance"; 
    private double _balance; 
    public double Balance 
    { 
        get 
        { 
            return _balance; 
        } 
        set 
        { 
            if (Math.Abs(_balance - value) < 0.001) 
            { return; } 
            var oldValue = _balance; 
            _balance = value; 
            RaisePropertyChanged(BalancePropertyName, oldValue, value, true);
        } 
    } 
} 
public class Receiver 
{ 
    public Receiver() 
    { 
        Messenger.Default.Register<PropertyChangedMessage<double>>( this, message => 
        { 
            if (message.PropertyName == BankViewModel.BalancePropertyName) 
            { 
                Debug.WriteLine( message.OldValue + " --> " + message.NewValue); 
            } 
        }); 
    } 
}

未取消注册时的内存泄漏风险

可见性 WPF Silverlight Windows Phone 8
静态 无风险 无风险 无风险
公共 无风险 无风险 无风险
内部 无风险 风险 风险
专用 无风险 风险 风险
匿名 Lambda 无风险 风险 风险
posted @ 2018-04-06 21:51  Devin.Zhou  阅读(994)  评论(0编辑  收藏  举报