首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF ViewModel或非ViewModel

WPF ViewModel或非ViewModel
EN

Stack Overflow用户
提问于 2015-02-16 02:52:19
回答 2查看 160关注 0票数 0

我有一个业务模型(实际上它是用Entity Framework6读取数据的)看起来像这样:

代码语言:javascript
复制
class Profile : NameDescriptionBase
{
    public virtual float Rate {get;set;}
    public virtual float HoursPerWeek {get;set;}

    public virtual IList<Task> Tasks {get;set;}
}

class Task : NameDescriptionBase
{
    public enum TastStates
    {
        New, Finished, Stopped, InProgress
    }

    public virtual IList<Task> Tasks {get;set;}
    public virtual TastState {get;set;}
    public virtual IList<TimeSpan> LoggedPeriods {get;set}
}

我想把这个模型绑定到TreeView上,它工作得很好(通过HierarchicalDataTemplate)。但我想自定义每个树叶,以指示每个任务的当前状态为组合框,以便用户能够更改它。在这里我被卡住了。

我可以在数据上下文中实现服务方法,它提供与TaskState值和it的Tuple<int, string>绑定,但我希望将其绑定到每个任务。我的主视图模型(即DataContext)如下所示:

代码语言:javascript
复制
class MasterViewModel
{
   public List<Profile> Profiles {get;set;}
   public Profile CurrentProfile  {get;set}

   public List<Task> ActiveTasks {get;}
   public List<Tasl> FinishedTasks {get;}

   ....
}

因此,当前用户配置文件和相应任务列表的更新很好,但看起来绑定到实体本身的属性不起作用。正如我所理解的那样--我的实体并没有实现INotifyPropertyChanged,因为它不是视图模型。

那么,对于我的案例来说,只有一种方法可以将每个任务转换为相应的视图模型,并在每次操作后将其实体和更新的字段保存到数据库中,这对吗?看起来很丑陋。

EN

回答 2

Stack Overflow用户

发布于 2015-02-16 04:05:16

MVVM模式的目的是首先提供视图-模型分离。因为你的视图是一个独立于模型的概念,所以在视图中定义一个额外的类(所谓的view model)来表示你的实体是非常好的。即使在每次更新时,您的TaskViewModel都会更新TaskEntity -在您调用SaveChanges()之前,不会将任何内容保存到数据库中。

票数 2
EN

Stack Overflow用户

发布于 2015-02-16 06:01:02

考虑一个更简单的例子:

使用这三个类,您可以轻松地显示您的配置文件(只读),但我打赌您已经知道:

查看您的视图

代码语言:javascript
复制
- Has a control bound to `Profiles`

  • ProfileEditorViewModel.cs,your ViewModel

代码语言:javascript
复制
- Has `public ICollection<Profile> Profiles { get; set; }`

  • Profile.cs,你的模型

如果你想改变你的模型,而视图是响应式的,你当然必须创建一个“迷你视图模型”。在这个读写实现中,您可能有:

查看您的视图

代码语言:javascript
复制
- Has a control bound to `ProfileProxies`

  • ProfileEditorViewModel.cs,your ViewModel

代码语言:javascript
复制
- Has `public ICollection<ProfileProxy> ProfileProxies { get; set; }`

  • ProfileProxy.cs,a 'mini ViewModel'

代码语言:javascript
复制
- Wraps a `Profile`, implementing INotifyPropertyChanged

  • Profile.cs,你的模型
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28529819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档