从异步方法绑定数据
本文关键字:数据 绑定 异步方法 | 更新日期: 2023-09-27 18:31:03
我仍在为我的项目而战,我几乎不需要帮助来前进。在 MainViewModel 中,我调用 Refresh 方法将数据从 XML 绑定到 ObservableCollection。
private async Task Refresh()
{
var listOfBadges = (await _badgeService.GetAll());
var listOfSets = (await _setService.GetAll());
BadgesList.Clear();
SetsList.Clear();
BadgesList = listOfBadges.ToObservableCollection<Badge>();
SetsList = listOfSets.ToObservableCollection<Set>();
}
没关系;)在QuestionViewModel中,我正在使用BadgeService的这种方法编辑这些数据,该方法实现了存储库模式。
public async Task Update(int id)
{
StorageFolder sf = await ApplicationData.Current.LocalFolder.GetFolderAsync("Data");
StorageFile st = await sf.GetFileAsync("Badgess.xml");
var xmlStream = await FileIO.ReadTextAsync(st);
XmlDocument xmlDoc = await XmlDocument.LoadFromFileAsync(st);
using (var stream = await st.OpenAsync(FileAccessMode.ReadWrite))
{
XmlElement root = xmlDoc.DocumentElement;
IXmlNode xee = root.SelectSingleNode("//badge/id[.='" + id + "']");
xee.NextSibling.NextSibling.NextSibling.InnerText = "true";
}
var xmlStreamUp = xmlDoc.GetXml();
if (xmlDoc != null)
await xmlDoc.SaveToFileAsync(st);
}
数据有变化,但是当我回到 MainViewModel 时,我无法看到绑定后的变化,但是当我点击绑定命令的按钮调用的刷新方法时,加载更改后的数据并且一切正常。如何避免返回主视图模型后点击刷新以正确绑定数据?
由于应用程序使用 xml 作为后备存储,请考虑将对象保留在内存中:
用于保存数据的存储库:
public interface IBadgeRepository
{
// Save Xml File
Task Save(IEnumerable<Badge> badges);
// Load Xml File
Task<Badge> GetAll();
}
操作数据的服务:
public sealed class BadgeService : IBadgeService
{
private readonly IBadgeRepository _badgeRepository;
private readonly List<Badge> _badges = new List<Badge>();
public BadgeService(IBadgeRepository badgeRepository)
{
_badgeRepository = badgeRepository;
}
public async Task<IList<Badge>> GetAll()
{
if(!_badges.Any())
{
var badges = _badgeRepository.GetAll();
_badges.AddRange(badges);
}
return Task.FromResult(_badge);
}
public async Task Update(Badge badge)
{
if(!_badges.Contains(badge))
{
_badges.Add(badge);
}
else
{
var index = _badges.IndexOf(badge);
_badges[index] = badge;
}
_badgeRepository.Save(_badges);
}
}
我发现问题的答案是调用DialogService以显示弹出窗口,更新xml并返回到MainViewModel
DialogService.ShowMessage("You should try another questions set!", "Game Over!", "Main Menu", GoToMainMenu);
它无法等待,所以我将其更改为:
await DialogService.ShowMessage("You should try another questions set!", "Game Over!");
await GoToMainMenu();
并以等待的方式从 BadgeService 调用 Update() 方法,如下所示:
private async Task GoToMainMenu()
{
await _badgeService.Update(SelectedSet.Id);
ViewModelLocator.Cleanup();
_navigationService.Navigate("MainPage");
}