有人可以张贴一个PropertyChangedMessage正在使用的工作示例吗?来自GalaSoft站点的描述如下:
PropertyChangedMessage:用于广播发送方中的属性更改。实现与PropertyChanged事件相同的目的,但方式不那么紧凑。
然而,这似乎是行不通的:
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"));
}发布于 2012-11-19 21:06:25
丹尼尔·卡斯特罗( Daniel )对我的问题提出了以下问题:“你对代码有什么期望?”
这个问题的答案促使我为我自己的问题写了这个答案。
我的期望是,基于MVVM文档中对PropertyChangedMessage类写得不好的描述,当我发送PropertyChangedMessage时,ViewModelBase类上的RaisePropertyChanged方法将被自动调用。
但很显然,情况正好相反。当您调用RaisePropertyChanged时,该方法有一个重载,您可以在该重载中设置一个标志,该标志确定是否将发送PropertyChangedMessage。
但是,我想要我最初期望的功能。我想发送一个新的PropertyChangedMessage,它会自动导致调用RaisePropertyChanged。以下是如何做到这一点。
使用以下公共ViewModelBase方法从NotifyPropertyChanged派生一个新类,该方法只调用受保护的RaisePropertyChanged方法:
public abstract class MyViewModelBase : GalaSoft.MvvmLight.ViewModelBase
{
public void NotifyPropertyChanged(string propertyName)
{
RaisePropertyChanged(propertyName);
}
}然后从PropertyChangedMessage派生一个新类,该类调用新的NotifyPropertyChanged方法:
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能够正确更新:
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;
}
}发布于 2012-11-19 20:14:55
这与相关。
在您的属性定义中,您可以这样使用:
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);
}
}然后,您可以使用以下内容对该属性进行任何修改:
Messenger.Default.Register<PropertyChangedMessage<string>>(
this, (e) => this.Name = e.NewValue
);看看这个帖子,阅读关于MVVM轻型信使的文章
广播:
Messenger.Default.Send<PropertyChangedMessage<string>>(oldValue, newValue, "PropertyName");https://stackoverflow.com/questions/13461278
复制相似问题