Xaml 使用MVVM刷新选项卡页中的数据
我有一个选项卡式页面,在其中添加条目,并在其他选项卡中列出数据。在使用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
<?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));
}
}