Caliburn.微问题:PropertyChangedBase,BindableCollection和AutoMapp
本文关键字:BindableCollection AutoMapp PropertyChangedBase 问题 Caliburn | 更新日期: 2023-09-27 18:27:50
我在WPF应用程序中使用Caliburn.Micro MVVM框架。视图中有一个绑定到BindableCollection<SomeObjectStatus>
的DataGrid
。
public class SomeObjectStatus
{
public string Message { get; set; }
public bool IsInitializing { get; set; }
}
我需要以某种方式通知UI SomeObjectStatus的任何属性是否已更改。常见的方法是在每个属性setter:中继承PropertyChangedBase
并调用NotifyOfPropertyChange()
public class SomeObjectStatus : PropertyChangedBase
{
private string _message;
private bool _isInitializing;
public string Message
{
get { return _message; }
set
{
if (value == _message)
return;
_message = value;
NotifyOfPropertyChange();
}
}
public bool IsInitializing
{
get { return _isInitializing; }
set
{
if (value == _isInitializing)
return;
_isInitializing = value;
NotifyOfPropertyChange();
}
}
}
但是SomeObjectStatus
是一个Model类,我不想用NotifyOfPropertyChange()
之类的东西来阻塞它。我可以创建一个具有相同属性的SomeObjectStatus
的克隆类,并专门为ViewModel实现PropertyChangedBase
,让我们称之为SomeObjectStatusWithNotify
。但在这种情况下,当发生更改时,我需要手动将每个属性从SomeObjectStatus
分配给SomeObjectStatusWithNotify
。在实际项目中,有太多的属性无法手动分配。因此,我需要以某种方式解决如何自动分配具有相同名称的SomeObjectStatus
到SomeObjectStatusWithNotify
的值的问题。感觉我需要类似AutoMapper的功能。但我需要为现有对象赋值,而不是像AutoMapper那样创建一个新对象。或者可能有一种从普通类创建PropertyChangedBase
的优雅方法?
Map()
:重载,AutoMapper可以为现有对象赋值
[TestClass]
public class C
{
[TestMethod]
public void M()
{
Mapper.CreateMap<SomeObject, SomeOtherObject>();
SomeObject source = new SomeObject {Name = "An Object"};
SomeOtherObject target = new SomeOtherObject {Id = 123};
Mapper.Map(source, target);
Assert.AreEqual(123, target.Id);
Assert.AreEqual("An Object", target.Name);
}
private class SomeOtherObject
{
public int Id { get; set; }
public string Name { get; set; }
}
private class SomeObject
{
public string Name { get; set; }
}
}