0

私はまだ自分のプロジェクトと戦っていますが、前進するための助けはほとんど必要ありません。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 に戻ると変更が表示されませんが、Commandをバインドするボタンによって呼び出されるRefreshメソッドを押すと、変更後のデータが読み込まれ、すべて問題ありません。データを適切にバインドするために MainViewModel に戻った後に Refresh を押さないようにするにはどうすればよいですか?

4

2 に答える 2

0

アプリケーションはバッキング ストアとして 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);
    }
}
于 2013-09-12T19:33:17.207 に答える