C# 从异步方法绑定数据

C# 从异步方法绑定数据,c#,data-binding,mvvm,async-await,C#,Data Binding,Mvvm,Async Await,我仍然在为我的项目奋斗,我需要的帮助很少。 在中,我调用方法将数据从XML绑定到ObservableCollection private async Task Refresh() { var listOfBadges = (await _badgeService.GetAll()); var listOfSets = (await _setService.GetAll()); BadgesList.Clear(); Set

我仍然在为我的项目奋斗,我需要的帮助很少。 在中,我调用方法将数据从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>();
    }
数据有变化,但当我返回MainViewModel时,我无法看到绑定后的变化,但当我点击绑定按钮调用的方法时,加载了变化后的数据,一切正常。
如何避免在返回MeVIEW模型后刷新刷新以正确绑定数据?

< p>因为应用程序使用XML作为后备存储,考虑将对象保存在内存中:

要保存数据的存储库:

public interface IBadgeRepository
{
    // Save Xml File
    Task Save(IEnumerable<Badge> badges);
    // Load Xml File
    Task<Badge> GetAll();
}
公共接口存储库
{
//保存Xml文件
任务保存(IEnumerable徽章);
//加载Xml文件
任务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);
    }
}
公共密封类徽章服务:IBadgeService
{
专用只读IBadgeRepository _badgeRepository;
私有只读列表_徽章=新列表();
公共徽章服务(IBadgeRepository-badgeRepository)
{
_badgeRepository=badgeRepository;
}
公共异步任务GetAll()
{
如果(!\u徽章.任何())
{
var badges=_badgeRepository.GetAll();
_徽章。添加范围(徽章);
}
返回任务.FromResult(_-badge);
}
公共异步任务更新(徽章)
{
如果(!_徽章包含(徽章))
{
_徽章。添加(徽章);
}
其他的
{
var指数=_badges.IndexOf(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();
并以等待的方式从调用Update()方法,如下所示:

private async Task GoToMainMenu()
    {
        await _badgeService.Update(SelectedSet.Id);
        ViewModelLocator.Cleanup();
        _navigationService.Navigate("MainPage");
    }

我想知道为什么您要手动操作xml而不使用对象并定期将其保存到xml文件中。xml是否像某种数据库?@Romoku是的,它是一种数据库,我使用XmlDocument是因为我知道这在Windows应用商店应用程序中是一种很好的做法,我没有发现在Windows应用商店应用程序中使用Linq2XML示例。Mml对数据库不太友好。您考虑过使用sqlite吗?如果您与xml结为夫妻,那么请尝试将对象保留在内存中,而不是操纵xml原始数据。这将减少出错的可能性,并使更改xml格式更容易。如果您感兴趣,这里有一个很好的教程。非常感谢,我将尝试您说的更好的方法,但这个问题的答案如下。
private async Task GoToMainMenu()
    {
        await _badgeService.Update(SelectedSet.Id);
        ViewModelLocator.Cleanup();
        _navigationService.Navigate("MainPage");
    }