2013-09-12 3 views
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, который реализует Repository Pattern.

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 я не в состоянии видеть изменения после связывания, но когда я ударил Refresh метод вызывается кнопкой, которые связывают Command, данные после изменения будут загружены и все в порядке. Как избежать удара Обновить после возврата в MainViewModel для правильной привязки данных?

+0

HTTP: // stackoverflow.com/questions/11176349/assigning-an-async-result-to-a-data-binding-property аналогичен –

+0

Мне нужно задаться вопросом, почему вы вручную манипулируете xml и не используете объект и периодически сохраняете его в xml-файл. Является ли xml действующим как какая-то база данных? – Romoku

+0

@Romoku Да, это своего рода база данных, я использую XmlDocument, потому что узнаю, что это хорошая практика в приложениях Windows Store, я не нашел пример Linq2XML в приложениях Windows Store. –

ответ

0

I узнайте, что проблема заключалась в вызове DialogService, чтобы отобразить всплывающее окно, обновить xml и вернуться к MainViewModel

DialogService.ShowMessage("You should try another questions set!", "Game Over!", "Main Menu", GoToMainMenu); 

это не awaitable поэтому мне пришлось изменить его на:

await DialogService.ShowMessage("You should try another questions set!", "Game Over!"); 
await GoToMainMenu(); 

И вызовите метод Update() из BadgeService в awaitable образом, как это:

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

Поскольку ваше приложение использует XML в качестве резервного хранилища рассмотреть хранение объектов в памяти:

Repository для хранения данных:

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); 
    } 
} 
+0

Большое спасибо, я попробую ваш подход, как вы говорите, это лучше, но ответ на вопрос этот вопрос ниже. –

Смежные вопросы