5

我已经为我的 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 代码首先会与这种类型的格式搭配得很好吗?

编辑 这是一个有点类似的问题在 MVVM 中 ViewModel 或 Model 是否应该实现 INotifyPropertyChanged? 但是,唯一的解决方案似乎是将我认为是 UI 逻辑的内容添加到模型中。也许我可以向模型添加某种委托并从视图模型中挂钩,这将反过来使用 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");
                }
            }
        }
...
4

2 回答 2

4

我正在做的是将我的模型类的实例创建为 ViewModel 中的属性,然后INotifyPropertyChanged直接在 Model 上实现 Model 属性,并在 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 中我直接绑定到模型属性,例如:

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

(TaskViewModel 将是视图的 DataContext。)

我这样做主要是为了避免您提到的这种“大量不必要的编码”,而且我找不到缺点。(我也使用 EF Code-First 使我的模型持久化。)

于 2011-02-21T18:00:45.183 回答
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。

于 2011-05-24T20:26:34.527 回答