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。在实际项目中,有太多的属性无法手动分配。因此,我需要以某种方式解决如何自动分配具有相同名称的SomeObjectStatusSomeObjectStatusWithNotify的值的问题。感觉我需要类似AutoMapper的功能。但我需要为现有对象赋值,而不是像AutoMapper那样创建一个新对象。或者可能有一种从普通类创建PropertyChangedBase的优雅方法?

Caliburn.微问题:PropertyChangedBase,BindableCollection和AutoMapp

如果使用正确的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; }
    }
}
相关文章:
  • 没有找到相关文章