【发布时间】:2018-05-18 01:46:17
【问题描述】:
我有一个视图,其中包含一组从 Web 服务获取的图像 我在此类的列表中收到它们:
public class ImageModel
{
public int Id { get; set; }
public string Name { get; set; }
public string imageUrl { get; set; }
}
在每张图片下我显示了一个投票按钮,因此我在上面的模型中添加了另一个 bool 属性:
public bool UpVoted { get; set; }
显示这些图像的 ListView 绑定到 ObservableCollection<ImageModel > ,当用户单击投票图标时,我想通过将 UpVoted 的值转换为相应图标的转换器更改投票图标:一个命令执行这个方法:
private void OnVoting(ImageModel image)
{
Images.Single(x => x.id == image.id).UpVoted = !image.UpVoted;
}
问题是 UI 没有更新,为了确保我理解问题,我将模型转换为 View 模型并对 UpVoted 属性进行了必要的更改(我正在使用 MVVM 灯光库)
bool upVoted;
public bool UpVoted
{
get { return upVoted; }
set
{
Set(ref upVoted, value);
}
}
它现在可以工作了,
所以我需要将UpVoted 绑定到 UI,所以它会在它改变时更新
【问题讨论】:
-
这里有什么问题?据我所知,您刚刚解释了 MVVM 的工作原理。
-
拥有可观察的 ImageModels 列表只会在添加或删除该列表的条目时通知。如果您希望模型通知其属性之一的更改,您必须在那里执行或像您一样使用 ViewModel。如果你想存储它或类似的东西,我只会让 ViewModel 引用模型的属性。
-
为了补充@Fildor 所说的,其中一种解决方案(至少在 UWP 中)是在您通过设置将 PropertyChanged 事件处理程序添加到列表中时订阅通知您的 ObservableCollection 的方法一个项目已被修改,而当您的项目已从集合中删除时则相反。
-
@Fildor 你能否详细说明一下:“如果你想存储它或类似的东西,我只会让 ViewModel 引用模型的属性”.. 如何实现这一点?
-
我只是提到“我把模型变成了视图模型”——我两者都有。所以你可以分离关注点。模型保存数据,ViewModel 为视图准备它们。因此,您可以保持模型原样,并且视图模型关心提出更改通知。
标签: c# xamarin mvvm xamarin.forms mvvm-light