我們的SoundBoard應用程式進展如何?
我們已經有了一個新的資料模型,并且在上一課中我們添加了示例資料,我們在設計時使用它們以幫助我們正确對應用程式的使用者界面進行布局,特别是我們使用了綁定到SoundData類執行個體的資料模闆。
在本課中我們将注意力轉移到在運作時綁定到真實的資料。
說實話,我們可以在應用程式的運作時使用相同的XAML檔案作為“實時資料”。如果您想這樣實作,您當然可以,并且您已經有了一個良好的開端。您可以用更多SoundGroup和SoundData的執行個體建構該XAML檔案,然後在運作時通過SoundModel類的LoadData()方法加載該檔案。
事實上這可能是一個很好的挑戰自己的方式。當您完成本系列課程後,您可以回過頭重新建立這個應用程式,但是請在此處使用不同的資料通路方法。努力才能學到東西,這樣的練習會迫使您努力找到在運作時加載XAML資料到資料模型的方法。
言歸正傳,本課的計劃:
在 SoundModel.cs檔案中,我們将建立一系列輔助方法,每個輔助方法被設計用于建立SoundData類的執行個體,這些執行個體将被添加到SoundGroup中的Items集合。
在建立完成所有的輔助方法後,我們将修改LoadData()方法,并對每個輔助方法進行調用。是以,當我們調用LoadData()時,真實的資料将會在運作時出現。
這是目前運作的應用程式:

我們沒有在運作時加載資料。我們需要完成的是将SoundModel類的每個公共屬性,比如說Animals,設定為某個已加載資料的SoundGroup對象的執行個體。是以,這裡是我希望在LoadData()方法中實作互動功能的一個示例:
剩下工作的就是實作CreateAnimalsGroup()輔助方法,如下所示:
CreateAnimalsGroup将傳回一個SoundGroup執行個體。
我們将建立一個SoundGroup執行個體并在整個輔助方法中建構它。
我們将設定Title屬性,它将作為PivotItem的标題屬性被顯示。
為避免輸入聲音檔案的完整路徑,我們将它儲存在一個變量中,并在初始化SoundData的每個新執行個體時對變量進行追加。
這裡我們向SoundGroup的Items屬性(類型是List<SoundData>)添加一個新的SoundData執行個體,并使用對象初始值設定項文法填充每個Title和FilePath屬性。
當運作應用程式時:
我們現在可以在動物PivotItem中看到所有的實際資料。
但是等一下,動物PivotItem的标題在哪裡?等一下我們将修複該問題。現在讓我們完成其餘Create___Group()方法的添加。
這裡是CreateCartoonsGroup()方法的清單:
這裡是CreateTauntsGroup()方法的清單:
這裡是CreateWarningsGroup()方法的清單:
現在我們将在LoadData()方法中使用這些輔助方法以填充每個相關的屬性:
如果我嘗試運作該應用程式,我看不到其它的PivotItem項,因為我們缺少PivotItem标題:
我的第一反應是這是一個綁定問題,資料沒有正确加載。我從OnNavigatedTo()事件處理程式開始查找問題。顯然,LoadData()在此處被調用:
接着我去檢視App.xaml.cs檔案。在構造函數中,如果viewModel為null将建立一個新的SoundModel執行個體:
我懷疑這是一個與時間順序有關的問題。Pivot控件在App.ViewModel為空時發起了對它的請求,然後DataTemplate在App.ViewModel被填充後發起對它的請求。(譯注:這就是為什麼看不到Pivot控件的标題而能夠看到PivotItem中的資料的原因)
在盯着它看了片刻之後,我在MainPage.xaml.cs中設定了斷點:
調試應用程式顯示DataContext在調用LoadData()前就被設定。這意味着PivotItem的标題立即就被綁定,但是PivotItems的ItemTemplates/ DataTemplates僅在我們調用了LoadData()後才進行綁定。
這就是我們隻見到一部分資料,但是沒有見到其它資料的原因。解決這個問題的方法很簡單:我們将在建立新的SoundModel執行個體後立即調用LoadData():
通過在App.xaml.cs中顯式地添加對LoadData()的調用,我們再次運作應用程式:
PivotItem的标題重新出現,并且我們可以導航到每個類别并檢視已經被加載的資料。
綜上所述,本課的重點是如何實作真實的資料。雖然我們可以采用不同的方法,我們選擇了建立輔助方法,這些輔助方法包含寫死的C# SoundData和SoundGroup類的執行個體。我們還看到了如何排查一個奇怪的有關資料綁定的時間順序問題,調試并了解事件的順序是一項寶貴的技能。
請不要忘記我在本課開始時提出的問題。這裡我希望您使用不同的資料通路技術重新建立此應用程式,例如用真實資料擴充SampleData.xaml,然後在運作時加載這些資料。有沒有想到解決的方法?我敢打賭如果花上一天時間,不需要我的幫助您就能解決問題。通過解決這個問題,您也許會比從本系列其它課程學到的都要多,因為隻有通過自己的努力才能真正學到東西。