नीचे एक नमूना कार्यान्वयन है जो ड्रॉप डाउन सूची में फ़ोल्डर की सूची पॉप्युलेट करने के लिए मेट्रो एपीआई और डेटा बाइंडिंग (एमवीवीएम का उपयोग करके) का उपयोग करता है।डेटा बाध्यकारी प्रॉपर्टी पर एक async परिणाम असाइन करना
व्यू मॉडल का कन्स्ट्रक्टर सेटफोल्डर्स विधि (निजी async) का उपयोग करता है, जो फ़ोल्डर की सूची प्राप्त करने के लिए एक प्रतीक्षा करने योग्य विधि फ़ाइल सेवा.गेटफोल्डर्सएसिंक() को कॉल करता है। फ़ोल्डरों की सूची को "फ़ोल्डर्सलिस्ट" नामक संपत्ति को सौंपा जाता है। XAML डेटा बाध्यकारी का उपयोग करके ड्रॉप डाउन सूची को पॉप्युलेट करने के लिए इस प्रॉपर्टी का उपयोग करता है।
मुझे आश्चर्य है कि फ़ोल्डर्सलिस्ट संपत्ति को नीचे कन्स्ट्रक्टर में सेट किए बिना सेट करने का एक बेहतर तरीका है। मैं GetFilesAsync विधि को कॉल करना पसंद करता हूं और जब वास्तविक डेटा बाध्यकारी होता है (कक्षा init के दौरान नहीं), FilesList गुण मान सेट करें। चूंकि गुण एसिंक/प्रतीक्षा मॉडिफायर्स का समर्थन नहीं करते हैं (जहां तक मुझे पता है) मैं एक उचित समाधान को लागू करने के लिए संघर्ष कर रहा हूं। किसी भी विचार की सराहना की।
कोड नीचे है।
ViewModel
public class FileViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private readonly IFileService fileService;
public FileDataViewModel(IFileService fileService)
{
this.fileService = fileService;
SetFolders();
}
private async void SetFolders()
{
FoldersList = await fileService.GetFoldersAsync();
}
private IEnumerable<IStorageFolder> foldersList;
public IEnumerable<StorageFolder> FoldersList
{
get { return foldersList; }
private set
{
foldersList = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("FoldersList"));
}
}
}
}
IFileService और कार्यान्वयन
public interface IFileService {
Task<IEnumerable<IStorageFolder>> GetFilesAsync();
}
public class FileService : IFileService
{
public async Task<IEnumerable<IStorageFolder>> GetFoldersAsync()
{
var folder = KnownFolders.DocumentsLibrary;
return await folder.GetFoldersAsync();
}
}
मुझे इस उत्तर में कोई समस्या दिखाई देती है। संपत्ति का गेटर्स फ़ोल्डर्स लोडडेटा का इंतजार नहीं करता है जो इसे ब्लॉक करना चाहिए। लेकिन लोडडाटा में एक समारोह का इंतजार है इसलिए नियंत्रण कॉलर/संपत्ति को वापस दे रहा है। मेरे लिए यह तात्पर्य है कि _ फ़ोल्डर्स जरूरी नहीं है और इस प्रकार फ़ोल्डर्स संपत्ति भी शून्य हो सकती है। – buckley
हां, नियंत्रण गेटटर को वापस दिया जाएगा। लेकिन यह कोई मुद्दा नहीं है, क्योंकि IsLoading प्रॉपर्टी को सत्य पर सेट किया जाएगा, यह संकेत है कि लोडिंग प्रगति पर है। जब fileService.GetFolderAsync() कार्य पूरा हो जाता है, तो लोडडेटा विधि का प्रवाह अपेक्षित के रूप में जारी रहेगा। यह सच है कि फ़ोल्डर्स संपत्ति कॉल के अंत में शून्य हो जाएगी। लेकिन जैसे ही GetFolderAsync() कार्य पूरा हो जाता है, एक PropertyChanged ईवेंट उठाया जाएगा। – Eilistraee
वास्तव में, यह सच है कि फ़ोल्डर्स संपत्ति सच हो सकती है। यह उम्मीद के अनुसार काम करता है: आप कॉल को अवरुद्ध नहीं करना चाहते हैं, इसलिए डेटा का आलसी प्रारंभिक रूप से सिंक्रनाइज़ नहीं हो सकता है। यदि आपको लोडडेटा का इंतजार करना है, तो इसे सार्वजनिक बनाएं और फ़ोल्डर को कॉल करने से पहले इसे सीधे प्रतीक्षा करें। अन्यथा, डेटा उपलब्ध होने पर डाटाबेसिंग को अद्यतन होने दें, या PropertyChanged पर भरोसा करें। – Eilistraee