直接在视图中绑定模型属性

2024-01-13

我在 Prism 中找到了这段文字文档 http://msdn.microsoft.com/en-us/library/gg405484%28v=pandp.40%29.aspx。我开始使用 MVVM,但我迷失了方向。我可以(应该)在视图中绑定模型属性吗?或者我必须为模型中的每个属性创建一个带有代理属性的视图模型?

The 模型类通常提供 财产和收藏的变化 通知事件通过 INotifyPropertyChanged 和 INotifyCollectionChanged 接口。这使他们能够轻松地获取数据 绑定在视图中。模型类 表示对象的集合 通常源自 ObservableCollection 类。

编辑:这里有一些额外的信息可以提供帮助。我正在从头开始构建一个个人项目(所以我也在设计模型),这是我第一次使用 MVVM,我想正确学习。

我的模型非常分层,具有包含更多类列表的类,其中包含更多列表,构建复杂的信息树。我正在尝试“标准”MVVM 方法,使用 POCO 构建模型,没有通知,并使用 List。然后使用适当的通知并使用 ObservableCollections 构建 ViewModel。

问题是,按照目前的情况,我几乎将整个模型重建为 ViewModel,并且必须保持 to (ObservableCollection 到列表)之间的数据同步。然后我在 Prism 文档上读到了这一点,想知道我是否应该遇到所有这些麻烦,或者只是为逻辑创建一个根 ViewModel 并将所有其余部分绑定到模型本身。


这实际上取决于,如果您的模型已经实现了 INotifyPropertyChanged 和/或 IError 信息,您可能希望将其正确绑定到模型属性。但是,如果您想要执行特殊的验证和模型一无所知的其他内容,则可以在视图模型中添加属性包装器。

本文给出了一个混合的很好的例子:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

通常我的 MV 属性看起来像这样,这很正常:

    public string Symbol
    {
        get { return Model.Symbol; }
        set { Model.Symbol = value; this.NotifyOfPropertyChange(() => this.Symbol); }
    }

我经常不在模型中实现 INotifyPropertyChanged,因此我经常必须编写包装器。

编辑:响应您的附加信息:保持集合和列表同步可能有点棘手。在您的情况下,我要做的是为每个模型类创建一个视图模型,但不包装所有属性,只需像这样访问它们:{Bindng Customer.Name}。但当然,您必须为包含视图模型的集合创建一个包装器。正如他们自己所说,Prism 文档只是指导,如果您的场景需要不同的方法,那么这很好。

看看这段代码。我只包装我将通过模型访问的集合和属性。这让您两全其美。然后,如果您需要一个不属于您的模型的特殊属性,您可以将其添加到视图模型中(请参阅 CustomerViewModel),或者如果您需要某些属性的特殊通知。

class CompanyViewModel{
  public CopanyViewModel(Company c){
     foreach(var customer in c.Customers)
       Customers.Add(new CustomerViewModel(customer);
  }
  public Company Company {get;set;}
  public ObservableCollection<CustomerViewModel> Customers {get;set;}
}

class CustomerViewModel{
  public CustomerViewModel(Customer c){
     Customer = c;
  }
  public Customer Customer {get;set;}

  public Brush CustomerBackground{
     get{
        if(Customer.Active)
           return Brush.Greeen;
        else
           return Brush.Red;
     }
  }
 }

(此代码可能不起作用,我只是在这里输入的。)

现在,如果您需要所有模型和所有属性的更改通知,您必须在模型中实现它或将所有属性包装在视图模型中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

直接在视图中绑定模型属性 的相关文章

随机推荐