在Prism的ObservableCollections中使用ViewModels

时间:2019-01-18 23:02:49

标签: c# xamarin mvvm xamarin.forms prism

据我所知,使用绑定到列表视图的ObservableCollection的默认方法是将模型类作为元素(com.ExecuteReader(); )。因此,当选择一个listview元素时,我们使用NavigateAsync并传递模型,然后ViewModel可以使用该模型“填充自身”。 这种方法的问题在于,无法在列表视图中使用ViewModel属性进行绑定。

例如: 我有一个View,ViewModel和Model“ PickList”,其中包含“ PickLine”对象的集合-每个对象都有一个View,ViewModel和Model本身。 PickLine对象包含属性“ PickedQuantity”和属性“ OpenQuantity”。现在,在我的PickList视图中,我不想将这两个绑定到单独的项目(例如,两个标签),但是我想要一个标签来同时显示这两种格式,例如“ PickedQuantity / OpenQuantity”。我知道可以通过使用多重绑定或类似的方法来解决此示例。但这不是全部的意思。 我的PickLine ViewModel已经具有“ QuantityString”属性,我想通过DataTemplate绑定到listview元素的标签。但是我该怎么做。甚至有可能吗?

2 个答案:

答案 0 :(得分:0)

使一个属性结合其他两个属性并绑定到该属性。例如:

公共字符串FullQuantity {获取{返回$“ {PickedQuantity} / {OpenQuantity}”;}}

然后在PickedQuantityOpenQuantity的setter中,您将要调用已设置的任何PropertyChanged方法,以通知属性更改绑定并传递{{ 1}}属性名称,以便在更改FullQuantityFullQuantity时更新绑定到PickedQuantity的元素。

这样,您只需将一个标签的文本绑定到一个属性,并且当更改两个数量属性中的任何一个时,该标签将被更新。

注意:我不熟悉Prism,但是不管使用哪种Mvvm框架,这种方法都应该有效。

答案 1 :(得分:-1)

您的PickListViewModel应该公开一个集合属性,该属性的项目类型为PickLineViewModel不是 PickLine)。

是否需要ObservableCollection<PickLineViewModel>取决于发生更改的位置-在最初创建PickLine的服务/模型中还是在GUI中,或者在这两者中。无论如何,您都必须确保更改从一侧(视图模型的集合)传播到另一侧(模型的集合)。 Google wrapping observable collection作为入门工具(提示:如果可能,请避免双向同步)。这些blog posts很旧,但仍然很实用,可以很好地阅读。 this answer中描述了一个简单的包装。