Xamarin MVVM数据绑定未刷新

Xamarin MVVM数据绑定未刷新,xamarin,mvvm,data-binding,Xamarin,Mvvm,Data Binding,我正在努力解决mvvm数据绑定问题。我没有为mvvm使用任何框架,我为视图模型提供了一个非常基本的基类。我上传了我的示例应用程序和我的问题到GitHub,找到下面的链接 我的问题是: 我有一个带有标签菜单的简单应用程序。有两个选项卡,分别称为“TabA”和“TabB”。两个视图都有一个简单的视图模型。视图模型引用了一个保存数据的管理器类。Manager类必须在observablecollection中创建对象(仅包含字符串并实现INotifyPropertyChanged的我的datamodel

我正在努力解决mvvm数据绑定问题。我没有为mvvm使用任何框架,我为视图模型提供了一个非常基本的基类。我上传了我的示例应用程序和我的问题到GitHub,找到下面的链接

我的问题是:

我有一个带有标签菜单的简单应用程序。有两个选项卡,分别称为“TabA”和“TabB”。两个视图都有一个简单的视图模型。视图模型引用了一个保存数据的管理器类。Manager类必须在observablecollection中创建对象(仅包含字符串并实现INotifyPropertyChanged的我的datamodel类的对象)。管理器中还有一个属性,它引用当前的choosen对象(它只是列表中两个对象之一)

“TabB”可以执行两个操作。第一个按预期工作。如果在条目中输入一些新字符串并点击第一个按钮,它将更新当前choosen对象的字符串并更新TabA中的标签

什么不起作用?使用我的“TabB”类中的第二个按钮,可以在管理器中切换当前choosen对象的值。在调试器中,我可以看到该值已更改,但“TabA”中的标签无法识别它必须更新该值

你能帮我吗

在杰森的帮助下,我得到了如下结果:

public class ViewModelBase:INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;


    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
在我的TabAViewModel中,我订阅了经理的活动:

    public TabAViewModel()
    {
        _mgr = Manager.Instance;
        _mgr.PropertyChanged += new PropertyChangedEventHandler(obj_PropertyChanged);
    }
然后我提出这个事件:

private void obj_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged("CurrentData");
    }
它将更新视图的标签


这可以吗,还是有“更好”的方法呢?

据我所知,更好的方法是使用INotifyPropertyChanged。如果要实现Notify,我认为需要实现INotifyPropertyChanged接口,可以创建一个继承INotifyPropertyChanged的类名ViewModelBase,如下所示:

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方法进行inotify

  private string _text;

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

        }
    }
ObservableCollection实现INotifyPropertyChanged,允许集合在集合内容发生更改时通知用户,特别是在集合内发生了什么更改。例如,如果向集合中添加项,则将引发CollectionChanged事件,其中的属性将告诉您新项的索引以及将该项包括在列表中。 所以ObservableCollection\u列表不需要调用RaisePropertyChanged方法


首先,请不要将代码作为场外回购的链接发布。花点时间确定哪些代码是相关的,并将其包含在您的帖子中。其次,您的VM无法知道Manager类中的数据何时发生变化。好的,我认为最好在GitHub上发布所有内容。下次我在这里发布相关代码,好吗?是的,这就是问题所在,但如何通知viewmodel?VM需要订阅管理器的PropertyChanged eventOk。谢谢你的提示。我在管理器中实现了INotifyPropertyChanged,但似乎不是这样。你能给我一个链接或者一个例子吗?:-)只有当有人正在侦听PropertyChanged事件时,INPC才起作用。数据绑定会自动为您执行此操作,但它仅在UI和BindingContext(VM)之间工作。由于在VM下面有另一层代码(manager),VM需要通过订阅其PropertyChanged来侦听manager的更改。