实体框架CTP5代码首先,WPF - MVVM建模

时间:2011-02-21 16:50:45

标签: wpf entity-framework mvvm code-first ef-code-first

我的模型是我的WPF应用程序的所有设置,并首先使用实体​​框架ctp5代码,这是一个示例模型类:

public class Task
{
    public int ID { get; set; }
    public int Index { get; set; }
    public string Content { get; set; }
    public int Indentation { get; set; }
    public DateTime Start { get; set; }
    public decimal Effort { get; set; }
    public decimal CompletedEffort { get; set; }
    public decimal Cost { get; set; }
}

构建视图模型的推荐方法是什么?我的视图模型将实现INotifyPropertyChanged,我不希望模型类具有任何UI特定代码 - 以便它们可以在其他应用程序中轻松重用。  我应该将所有模型属性设置为虚拟,然后在视图模型中覆盖它们吗? (似乎有很多不必要的编码...)EF代码首先会使用这种格式吗?

修改 这是一个有点类似的问题In MVVM should the ViewModel or Model implement INotifyPropertyChanged?但是,唯一的解决方案似乎是将我认为是UI逻辑添加到模型中。也许我可以在模型中添加某种委托并从viewmodel挂钩,然后将使用INotifyPropertyChanged ...这样的东西?

    public class Task
    {
        public delegate void HandleChange(string propertyName);
        public HandleChange ChangeHandler;

        public int ID 
        { 
            get
            {
                return ID;
            } 
            set
            {
                if(ID != value)
                {
                    ID = value;
                    ChangeHandler("ID");
                }
            }
        }
...

2 个答案:

答案 0 :(得分:4)

我正在做的是将我的模型类的实例创建到ViewModel中的属性,然后直接在Model的Model上实现INotifyPropertyChanged,在ViewModel上仅为Model实例实现,如此:

public class Task : INotifyPropertyChanged
{
    // Implementation of INotifyPropertyChanged
    // Raising the PropertyChanged event in the Setters of all properties
}

public class TaskViewModel : INotifyPropertyChanged
{
    private Task _task;
    public Task Task
    {
        get
        {
            return _task;
        }
        set
        {
            if (_task != value)
            {
                _task = value;
                RaisePropertyChanged("Task");
            }
        }
    }

    // INotifyPropertyChanged implementation
}

然后在XAML中我直接绑定到Model属性,例如:

<TextBox Text="{Binding Task.Content}" />

(TaskViewModel将是View的DataContext。)

我这样做主要是为了避免你提到的“很多不必要的编码”,我找不到一个缺点。 (我也使用EF Code-First使我的模型持久化。)

答案 1 :(得分:3)

我知道这是一个老线程,但我在谷歌上搜索这个话题并偶然发现这篇blogs.msdn.com文章:http://bit.ly/iE3KHI

简而言之,从EF CodeFirst的CTP 4开始,CodeFirst dbSet对象的一个​​新属性.Local。 .Local是一个实现INotifyPropertyChanged的ObservableCollection。因此,如果您有一个代码,第一个dbcontext公开了一个名为Tasks的DbSet(Of Task),您可以将表单数据上下文设置为Tasks.Local。