【问题标题】:Xamarin MVVM Databinding not refreshingXamarin MVVM 数据绑定不刷新
【发布时间】: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


【解决方案1】:

据我所知,更好的方法是使用 INotifyPropertyChanged。如果你想实现Notify,我觉得你需要实现INotifyPropertyChanged接口,你可以创建一个类名ViewModelBase,继承INotifyPropertyChanged,像这样:

public class ViewModelBase:INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;


    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

然后你可以调用 RaisePropertyChanged 方法来通知当属性改变时,

  private string _text;

    public string Text
    {
        get
        {
            return _text;
        }
        set
        {
            _text = value;
            RaisePropertyChanged("Text");

        }
    }

ObservableCollection 实现了 INotifyPropertyChanged,允许集合在集合的内容发生变化时通知用户 - 特别是集合内发生的变化。例如,如果您将一个项目添加到集合中,将引发 CollectionChanged 事件,其中的属性告诉您新项目的索引以及将该项目包括在列表中。 所以 ObservableCollection _list 不需要调用 RaisePropertyChanged 方法。

https://docs.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.observablecollection-1.system-componentmodel-inotifypropertychanged-propertychanged?view=netframework-4.7.2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2019-01-18
    • 2013-10-26
    • 2011-09-29
    • 2018-02-16
    相关资源
    最近更新 更多