【发布时间】:2019-07-13 06:46:44
【问题描述】:
我正在为 mvvm 数据绑定而苦苦挣扎。我没有为 mvvm 使用任何框架,我的视图模型有一个非常基本的基类。我将带有问题的示例应用程序上传到 GitHub,找到下面的链接。
我的问题:
我有一个带有标签菜单的简单应用程序。有 2 个选项卡,称为“TabA”和“TabB”。两个视图都有一个简单的视图模型。视图模型引用了一个保存数据的管理器类。 Manager 类必须包含 observablecollection 中的对象(我的数据模型类的对象,它只包含一个字符串并实现 INotifyPropertyChanged)。管理器中还有一个属性,它引用当前选择的对象(它只是列表中的 2 个对象之一)。
“TabB”可以完成 2 个操作。第一个按预期工作。如果您在条目中输入一些新字符串并点击第一个按钮,它会更新当前选择对象的字符串并更新 TabA 中的标签。
什么不工作?使用我的“TabB”类中的第二个按钮,您可以切换管理器中当前选择的对象的值。在调试器中,我可以看到值已更改,但“TabA”中的标签无法识别它必须更新值。
你能帮帮我吗?
https://github.com/dercdev/MVVM-Xamarin
在 Jason 的帮助下,我得到了这样的结果:
在我的 TabAViewModel 中,我订阅了 Manager 的事件:
public TabAViewModel()
{
_mgr = Manager.Instance;
_mgr.PropertyChanged += new PropertyChangedEventHandler(obj_PropertyChanged);
}
然后我提出这个事件:
private void obj_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
OnPropertyChanged("CurrentData");
}
这会更新视图的标签。
这样可以吗,还是有“更好”的方法?
【问题讨论】:
-
首先,请不要将代码发布为非现场回购的链接。花时间确定哪些代码是相关的,并将其包含在您的帖子中。其次,您的 VM 无法知道 Manager 类中的数据何时发生变化。
-
好的,我认为将所有内容都发布在 GitHub 上会更好。下次我把相关代码贴在这里,好吗?是的,这就是问题所在,但我如何通知视图模型?
-
VM需要订阅管理器的PropertyChanged事件
-
好的。感谢您的提示。我在管理器中实现了 INotifyPropertyChanged,但这似乎不是。你能给我一个链接或一个例子吗? :-)
-
INPC 仅在有人监听 PropertyChanged 事件时才有效。数据绑定会自动为您执行此操作,但它仅适用于 UI 和 BindingContext (VM)。由于您在 VM 下还有另一层代码(管理器),因此 VM 需要通过订阅其 PropertyChanged 来监听来自管理器的更改。
标签: xamarin mvvm data-binding