Xaml 使用MVVM刷新选项卡页中的数据

Xaml 使用MVVM刷新选项卡页中的数据,xaml,mvvm,xamarin.forms,Xaml,Mvvm,Xamarin.forms,我有一个选项卡式页面,在其中添加条目,并在其他选项卡中列出数据。在使用MVVM向数据库添加条目后,如何刷新数据 主页: <?xml version="1.0" encoding="utf-8" ?> <TabbedPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xm

我有一个选项卡式页面,在其中添加条目,并在其他选项卡中列出数据。在使用MVVM向数据库添加条目后,如何刷新数据

主页:

<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:myMood.Views"
             x:Class="myMood.Views.MainPage"
            BackgroundImage="logo.png">

    <local:Register></local:Register>
    <local:Entries></local:Entries>
    <local:Statistics></local:Statistics>
    <local:Settings></local:Settings>
    <local:About></local:About>
</TabbedPage>

您需要在viewmodel中实现INotifyPropertyChanged接口。因为当前viewmodel没有向UI发送数据已更改的信号

因此,您的viewmodel应该如下所示:

public class EntriesViewModel : INotifyPropertyChanged
{
    private List<MoodEntry> _moodEntries;
    public List<MoodEntry> MoodEntries
    {
        get { return _moodEntries; }
        set { _moodEntries = value; OnPropertyChanged(); }
    }

    public EntriesViewModel()
    {
        MoodEntries = App.MoodDatabase.GetMoodEntries();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
公共类EntriesViewModel:INotifyPropertyChanged
{
私人名单;
公开名单
{
获取{return\u moodEntries;}
设置{u moodEntries=value;OnPropertyChanged();}
}
公共EntriesViewModel()
{
MoodEntries=App.MoodDatabase.GetMoodEntries();
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}

您需要在viewmodel中实现INotifyPropertyChanged界面。因为当前viewmodel没有向UI发送数据已更改的信号

因此,您的viewmodel应该如下所示:

public class EntriesViewModel : INotifyPropertyChanged
{
    private List<MoodEntry> _moodEntries;
    public List<MoodEntry> MoodEntries
    {
        get { return _moodEntries; }
        set { _moodEntries = value; OnPropertyChanged(); }
    }

    public EntriesViewModel()
    {
        MoodEntries = App.MoodDatabase.GetMoodEntries();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
公共类EntriesViewModel:INotifyPropertyChanged
{
私人名单;
公开名单
{
获取{return\u moodEntries;}
设置{u moodEntries=value;OnPropertyChanged();}
}
公共EntriesViewModel()
{
MoodEntries=App.MoodDatabase.GetMoodEntries();
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}

是否需要在添加条目的第一个选项卡中添加逻辑?在我添加了一些之后,列表似乎没有更新。可能
列表
不是用于更新的合适存储。尝试改用
可观察收集
,因为如果在其中添加一个项目,它将自动引发一个事件,用户界面必须进行更新。你能分享你添加条目的代码吗?将RegisterViewModel添加到post。我需要在我添加条目的第一个选项卡中添加逻辑吗?在我添加了一些之后,列表似乎没有更新。可能
列表
不是用于更新的合适存储。尝试改用
可观察收集
,因为如果在其中添加一个项目,它将自动引发一个事件,用户界面必须进行更新。你能分享你添加条目的代码吗?添加了RegisterViewModel到post。
namespace myMood.ViewModels
{
    public class RegisterViewModel : INotifyPropertyChanged
    {
        public MoodEntry MoodEntry { get; set; }
        public DateTime LowerLimitDate { get; set; }
        public DateTime HighLimitDate { get; set; }

        public Command SaveEntry
        {
            get
            {
                return new Command(() =>
                    App.MoodDatabase.SaveMoodEntry(MoodEntry));
            }
        }

        public RegisterViewModel()
        {
            MoodEntry = App.MoodDatabase.GetMoodEntry(DateTime.Today);
            if (MoodEntry == null)
                MoodEntry = new MoodEntry();

            LowerLimitDate = new DateTime(2018, 1, 1);
            HighLimitDate = DateTime.Today;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
public class EntriesViewModel : INotifyPropertyChanged
{
    private List<MoodEntry> _moodEntries;
    public List<MoodEntry> MoodEntries
    {
        get { return _moodEntries; }
        set { _moodEntries = value; OnPropertyChanged(); }
    }

    public EntriesViewModel()
    {
        MoodEntries = App.MoodDatabase.GetMoodEntries();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}