2015-01-21 57 views
1

我正在開發WP 8.1中的音樂播放器應用程序我正在嘗試將跳轉列表功能加入其中。 爲了實現跳轉列表,我遵循here的示例。不能將void分配給WP 8.1中的隱式類型局部變量

我正在對可用代碼&進行一些必要的更改,這就是我如何在C#中實現所需的功能,MVVM & WP 8.1最小。

但我面對我的視圖模型錯誤在行

var items = ContactModel.CreateSampleData(); 

和錯誤是:

Cannot assign void to an implicitly-typed local variable 

可能是什麼可能的原因????任何人都可以幫助我理解我出錯的地方。

using System.Collections; 
using Windows.UI.Xaml.Data; 
using JumpListSample.Common.JumpList; 
using System.Collections.Generic; 
using Windows.UI.Xaml.Media; 
using Windows.UI.Xaml.Media.Imaging; 
using System; 
using Windows.Storage; 
using Windows.Storage.Search; 
using System.Collections.ObjectModel; 

namespace JumpListSample.ViewModels 
{ 
    public class ContactsViewModel 
    { 
     private IList data; 
     public IList Data 
     { 
      get 
      { 
       if (data == null) 
       { 
        var items = ContactModel.CreateSampleData(); 
        data = items.ToAlphaGroups(x => x.Name); 
       } 
       return data; 
      } 
     } 
     private CollectionViewSource collection; 

     public CollectionViewSource Collection 
     { 
      get 
      { 
       if (collection == null) 
       { 
        collection = new CollectionViewSource(); 
        collection.Source = Data; 
        collection.IsSourceGrouped = true; 
       } 
       return collection; 
      } 
     } 
    } 

    public class ContactModel 
    { 
     // constructor 
     public ContactModel() 
     { 
      Name = "name"; 
      Albumart = new BitmapImage(new Uri("ms-appx:///Assets/Logo.scale-240.png")); 
     } 

     public async static void CreateSampleData() 
     { 
      ObservableCollection<ContactModel> data = new ObservableCollection<ContactModel>(); 

      try 
      { 
       IReadOnlyList<IStorageItem> MusicLibrary = await KnownFolders.MusicLibrary.GetFoldersAsync(CommonFolderQuery.GroupByAlbum); 
       foreach (IStorageItem item in MusicLibrary) 
       { 
        ContactModel obj = new ContactModel(); 
        IStorageItem musicItem = item; 
        obj.Name = musicItem.Name; 
        obj.Albumart = new BitmapImage(new Uri("ms-appx:///Assets/Logo.scale-240.png")); 
        data.Add(obj); 
       } 
      } 
      catch 
      { 
      } 
      finally 
      { 
      } 
     } 

     public string Name { get; set; } 
     public ImageSource Albumart { get; set; } 
    } 
} 

演示代碼可以從here下載。

+2

ContactModel.CreateSampleData()不返回任何東西(技術上它返回void),所以你不能將它分配給一個變量。您可能想要返回「數據」公共異步任務> CreateSampleData()。順便說一句空的「終於」聲明是沒有意義的 – 2015-01-21 05:43:47

+1

我還應該補充說,你將不得不「等待」結果。即。 var items = await ContactModel.CreateSampleData(); – 2015-01-21 05:49:39

+0

我會誠實地說,我沒有深入研究所有這些的頭部空間,但「項目」將是一個列表,所以你會返回「數據」。即整個列表 – 2015-01-21 06:00:03

回答

2

我同意評論者Clint Good的建議。您的CreateSampleData()方法似乎負責初始化ContactModel實例的集合。據推測,你打電話給Data屬性,因爲這些是你想用來初始化data字段的項目。

這就是說,你有一個嚴重的問題:C#屬性不支持async/await模式。解決這個問題的一個習慣用法是異步初始化後臺字段,然後在初始化完成時引發屬性更改的事件。不幸的是,您的ContactsViewModel類不實現INotifyPropertyChanged或繼承DependencyObject(基於XAML的程序處理屬性更改通知的兩種方式)。

採取一切在一起,使你的代碼進行必要的修改,你會風與這樣的:

ContactsViewModel:

public class ContactsViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    private IList data; 
    public IList Data 
    { 
     get 
     { 
      if (data == null) 
      { 
       // Ignore the returned Task...we're not going to do anything with it 
       var _ = InitData(); 
      } 

      // Caller should handle null. If not, need to return "new Data[0]" here instead 
      return data; 
     } 
    } 

    private async Task InitData() 
    { 
     // Catch _specific_ exceptions here, if necessary 

     var items = await ContactModel.CreateSampleData(); 
     data = items.ToAlphaGroups(x => x.Name); 
     OnPropertyChanged("Data"); 
    } 

    private CollectionViewSource collection; 

    public CollectionViewSource Collection 
    { 
     get 
     { 
      if (collection == null) 
      { 
       collection = new CollectionViewSource(); 
       collection.Source = Data; 
       collection.IsSourceGrouped = true; 
      } 
      return collection; 
     } 
    } 
} 

ContactModel:

public class ContactModel 
{ 
    // constructor 
    public ContactModel() 
    { 
     Name = "name"; 
     Albumart = new BitmapImage(new Uri("ms-appx:///Assets/Logo.scale-240.png")); 
    } 

    public async static Task<ObservableCollection<ContactModel>> CreateSampleData() 
    { 
     ObservableCollection<ContactModel> data = new ObservableCollection<ContactModel>(); 

     IReadOnlyList<IStorageItem> MusicLibrary = await KnownFolders.MusicLibrary.GetFoldersAsync(CommonFolderQuery.GroupByAlbum); 
     foreach (IStorageItem item in MusicLibrary) 
     { 
      ContactModel obj = new ContactModel(); 
      IStorageItem musicItem = item; 
      obj.Name = musicItem.Name; 
      obj.Albumart = new BitmapImage(new Uri("ms-appx:///Assets/Logo.scale-240.png")); 
      data.Add(obj); 
     } 

     return data; 
    } 

    public string Name { get; set; } 
    public ImageSource Albumart { get; set; } 
} 

請注意,我也完全刪除了您的try/catch。簡單地吞下例外情況是非常糟糕的。如果您認爲需要處理任何異常,請在調用者(即ContactsViewModel.InitData())中處理它們,您可以在其中執行一些有用的操作並在必要時通知用戶(但只處理特定異常,您知道如何響應的異常)。

相關問題