首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVVM-Light -如何使用PropertyChangedMessage

MVVM-Light -如何使用PropertyChangedMessage
EN

Stack Overflow用户
提问于 2012-11-19 20:03:37
回答 2查看 10.5K关注 0票数 3

有人可以张贴一个PropertyChangedMessage正在使用的工作示例吗?来自GalaSoft站点的描述如下:

PropertyChangedMessage:用于广播发送方中的属性更改。实现与PropertyChanged事件相同的目的,但方式不那么紧凑。

然而,这似乎是行不通的:

代码语言:javascript
复制
private bool m_value = false;
public bool Value
{
    get { return m_value ; }
    set 
    { 
        m_value = value;
        Messenger.Default.Send(new PropertyChangedMessage<bool>(m_value, true, "Value"));
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-19 21:06:25

丹尼尔·卡斯特罗( Daniel )对我的问题提出了以下问题:“你对代码有什么期望?”

这个问题的答案促使我为我自己的问题写了这个答案。

我的期望是,基于MVVM文档中对PropertyChangedMessage类写得不好的描述,当我发送PropertyChangedMessage时,ViewModelBase类上的RaisePropertyChanged方法将被自动调用。

但很显然,情况正好相反。当您调用RaisePropertyChanged时,该方法有一个重载,您可以在该重载中设置一个标志,该标志确定是否将发送PropertyChangedMessage。

但是,我想要我最初期望的功能。我想发送一个新的PropertyChangedMessage,它会自动导致调用RaisePropertyChanged。以下是如何做到这一点。

使用以下公共ViewModelBase方法从NotifyPropertyChanged派生一个新类,该方法只调用受保护的RaisePropertyChanged方法:

代码语言:javascript
复制
public abstract class MyViewModelBase : GalaSoft.MvvmLight.ViewModelBase
{
    public void NotifyPropertyChanged(string propertyName)
    {
        RaisePropertyChanged(propertyName);
    }
}

然后从PropertyChangedMessage派生一个新类,该类调用新的NotifyPropertyChanged方法:

代码语言:javascript
复制
public class MyPropertyChangedMessage<T> : PropertyChangedMessage<T>
{
    public MyPropertyChangedMessage(object sender, T oldValue, T newValue, string propertyName)
        : base(sender, oldValue, newValue, propertyName)
    {
        var viewModel = sender as MyViewModelBase;

        if (viewModel != null)
        {
            viewModel.NotifyPropertyChanged(propertyName);
        }
    }

    public MyPropertyChangedMessage(object sender, object target, T oldValue, T newValue, string propertyName)
        : base(sender, target, oldValue, newValue, propertyName)
    {
        var viewModel = sender as MyViewModelBase;

        if (viewModel != null)
        {
            viewModel.NotifyPropertyChanged(propertyName);
        }
    }
}

我对这种方法进行了测试,并验证了我确实可以编写如下代码,从而使UI能够正确更新:

代码语言:javascript
复制
private bool m_value = false;
public bool Value
{
    get { return m_value; }
    set
    {
        Messenger.Default.Send(new MyPropertyChangedMessage<bool>(this, m_value, value, "Value"));
        m_value = value;
    }
}
票数 4
EN

Stack Overflow用户

发布于 2012-11-19 20:14:55

这与相关。

在您的属性定义中,您可以这样使用:

代码语言:javascript
复制
public string Name {
    get
    {
        return _name;
    }
     set
    {
        if (_name == value)
        {
            return;
        }
         var oldValue = _name;
        _name = value;
         // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
        RaisePropertyChanged(Name, oldValue, value, true);
    }
}

然后,您可以使用以下内容对该属性进行任何修改:

代码语言:javascript
复制
Messenger.Default.Register<PropertyChangedMessage<string>>(
    this, (e) => this.Name = e.NewValue
);

看看这个帖子,阅读关于MVVM轻型信使的文章

广播:

代码语言:javascript
复制
Messenger.Default.Send<PropertyChangedMessage<string>>(oldValue, newValue, "PropertyName");
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13461278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档