0

我有小型 WPF 应用程序。解决方案中有 5 个项目。

我想要使​​用 UI ENTITIES 单独的 DOMAIN 类,并且我想使用 AUTOMAPPER。

您可以在此处下载整个解决方案:TestWPFAutomapper.zip

具有 UI 实体(Entities.Destination.cs)的域类(Domain.Source.cs)具有相同的签名。

在 Entities.Destination.cs 我想加入其他逻辑。

namespace DOMAIN
{
    public class Source
    {
        public int Id { get; set; }
        public int Position { get; set; }
    } 
}


using System.ComponentModel;

namespace ENITITIES
{
    public class Destination : INotifyPropertyChanged 
    {
        private int _id;
        private int _position;

        public int Id
        {
            get { return _id; }
            set
            {
                _id = value;
                OnPropertyChanged("Id");
            }
        }

        public int Position
        {
            get { return _position; }
            set
            {
                _position = value;
                OnPropertyChanged("Position");
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

我的数据来自使用带有 CodeFirst 的实体框架的 DAL.DataContext。在这里,我正在使用 Source 类。

using System.Data.Entity;
using DOMAIN;

namespace DAL
{
    public class DataContext : DbContext
    {
        public DbSet<Source> Sources { get; set; }
    }
}

映射位于 BL.MyAppLogic.cs 中。在这个类中,我有属性 Items,它是 ObservableCollection。

将另一个项目放入数据库后,源类集合得到刷新,但目标不刷新。

using System.Collections.ObjectModel;
using System.Data.Entity;
using System.Linq;
using AutoMapper;
using DAL;
using DOMAIN;
using ENITITIES;

namespace BL
{
    public class MyAppLogic
    {
        private readonly DataContext _dataContext = new DataContext();
        public ObservableCollection<Source> Items { get; set; }
        //public ObservableCollection<Destination> Items { get; set; }

        public MyAppLogic()
        {
            Database.SetInitializer(new MyInitializer());
            Mapping();

            _dataContext.Sources.Load();
            Items = _dataContext.Sources.Local;
            //Items = Mapper.Map<ObservableCollection<Source>, ObservableCollection<Destination>>(_dataContext.Sources.Local);
        }

        private void Mapping()
        {
            Mapper.CreateMap<Source, Destination>().ReverseMap();
            // I tried also Mapper.CreateMap<ObservableCollection<Source>, ObservableCollection<Destination>>().ReverseMap();
        }

        public int GetLastItem()
        {
            return _dataContext.Database.SqlQuery<int>("select Position from Sources").ToList().LastOrDefault();
        }

        public void AddNewItem(Destination newItem)
        {
            _dataContext.Sources.Add(Mapper.Map<Destination, Source>(newItem));
            _dataContext.SaveChanges();
        }
    }
}

我的问题不在于映射,这很好用,而是在从数据库中添加或删除项目后刷新集合。如果我使用 DOMAIN.Source 类一切正常,集合令人耳目一新。但是当我使用 ENTITIES.Destination 数据来自数据库时,我也可以将一些新数据放入数据库,但重新定义 ObservableCollection 不起作用。

请尝试在 BL.MyAppLogic.cs 中注释行(14 和 23)并取消注释(15 和 24),你会明白我的意思。

感谢您的任何帮助。

4

1 回答 1

0

我知道了,但我不知道是否正确。

本地有 CollectionChanged 事件

所以在构造函数中我把这些行

public MyAppLogic()
        {
            Database.SetInitializer(new MyInitializer());
            Mapping();

            _dataContext.Sources.Load();

            _dataContext.Sources.Local.CollectionChanged += SourcesCollectionChanged;

            Items = Mapper.Map<ObservableCollection<Source>, ObservableCollection<Destination>>(_dataContext.Sources.Local);

        }

和处理程序看起来

private void SourcesCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            var source = sender as ObservableCollection<Source>;

            Mapper.Map(source, Items);
        }

现在,当我在 UI 中将某些内容放入 DB 时,我的收藏会自动刷新。看起来自动映射器不会将引用放入项目中,而是创建新实例。

于 2013-07-16T19:09:41.763 回答