gpt4 book ai didi

data-binding - 直接在 View 中绑定(bind)模型属性

转载 作者:行者123 更新时间:2023-12-02 00:33:14 25 4
gpt4 key购买 nike

我在 Prism documentation 中找到了这段文字.我开始使用 MVVM,但我迷路了。我可以(应该)在 View 中绑定(bind)模型属性,还是必须为模型中的每个属性创建一个具有代理属性的 View 模型?

The model classes typically provide property and collection change notification events through the INotifyPropertyChanged and INotifyCollectionChanged interfaces. This allows them to be easily data bound in the view. Model classes that represent collections of objects typically derive from the ObservableCollection class.

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

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

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

最佳答案

这实际上取决于,如果您的模型已经实现了 INotifyPropertyChanged 和/或 IError 信息,您可能希望直接绑定(bind)到模型属性。但是,如果您想进行特殊验证和其他模型不知道的事情,您可以在 View 模型中添加属性包装器。

这篇文章给出了一个很好的混合示例: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,因此我经常不得不编写包装器。

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

看看这段代码。我只包装了我将通过模型访问的集合和属性。这为您提供了两全其美的体验。然后,如果您需要一个不属于您的模型的特殊属性,您可以将它添加到 View 模型(请参阅 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;
}
}
}

(此代码可能无法运行,我只是在此处输入。)

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

关于data-binding - 直接在 View 中绑定(bind)模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5809305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com