2009-07-05 15 views
7

का उपयोग कर 'प्रतीक्षा' स्क्रीन के लिए आम तौर पर पसंदीदा विधि मैं अवधारणा अनुप्रयोग के एक छोटे से सबूत के साथ आगे बढ़ रहा हूं। यह ज्यादातर सिल्वरलाइट के भीतर मेरे एमवीवीएम कौशल को गोम लगाने के लिए है। मैं आज एक दिलचस्प समस्या में आया कि मुझे यह नहीं पता था कि एमवीवीएम तरीके को कैसे हल किया जाए। मैं खोज के दौरान प्रासंगिक कुछ भी खोजने में सफल नहीं था।एमवीवीएम और सिल्वरलाइट

तो समस्या पर, मेरे पास डेटाबेस बैक एंड के साथ एक साधारण व्यवसाय प्रकार का एप्लिकेशन है। मेरे पास एक लॉगिन व्यू और एक व्यू मॉडल संलग्न है जो लॉगिन करेगा और सफलता या विफलता की रिपोर्ट करेगा। कोई बात नहीं। जो अभी तक मैं खुश नहीं हूं, वह अभी भी उपयोगकर्ता को प्रतीक्षा स्क्रीन की रिपोर्ट करने का एक तरीका है। तो मेरी लॉगिन स्क्रीन दी गई, उपयोगकर्ता लॉगिन पर क्लिक करता है और डेटाबेस चैट करने के दौरान कुछ सेकंड की देरी होती है। मैं इसकी रिपोर्ट करना चाहता हूं और कॉल पूरा होने तक किसी भी बातचीत को अक्षम करना चाहता हूं।

मेरे पास कुछ विचार थे। सबसे पहले, कर्सर संपत्ति को व्यूमोडेल से बांधें और वीएम एक आईसबुसी संपत्ति को सत्य में सेट कर सकता है। इसके साथ समस्या यह है कि मैं UserControl के लिए कर्सर से जुड़ना प्रतीत नहीं कर सकता (विजुअल स्टूडियो AG_E_RUNTIME_MANAGED_UNKNOWN_ERROR कहता है)।

दूसरा विचार प्रतीक्षा स्क्रीन है। आप जानते हैं, छोटे गियर मोड़ या जो भी एनीमेशन आप चाहते हैं। और यह ठीक है, लेकिन यह मेरे लिए वास्तविक नहीं है कि मैं इस मॉडल को Xaml के माध्यम से मॉडल के माध्यम से कैसे टॉगल कर सकता हूं। मुझे पता है कि मैं निश्चित रूप से घटनाओं को हुक कर सकता हूं और कोड में इसे संभाल सकता हूं। शायद यह जाने का रास्ता है? एमवीवीएम अनाज के खिलाफ थोड़ा सा लगता है।

इस पर इसे संभालने के तरीके के बारे में अधिक विचारों में रुचि होगी।

धन्यवाद।

उत्तर

1

हम लंबे समय से चल रहा है अनुरोध पर काम के लिए एक सेवा का उपयोग कर समाप्त हो गया है। यह सेवा एक प्रतिनिधि के रूप में वर्कलोड लेती है, और उसके बाद इसे "वर्क प्रतीक्षा" दृश्य खोलते समय पृष्ठभूमिवर्कर को पास कर देती है।

यह अच्छी तरह से काम करता है क्योंकि यह हमें एक बिल्कुल सरल इंटरफेस के साथ, हमारे सभी व्यू मॉडलों में लंबी चल रही प्रक्रियाओं को नियंत्रित करने की अनुमति देता है।

आपके पास व्यूमोडेल से आने वाली घटनाएं हो सकती हैं जब आपको देरी की आवश्यकता होती है, लेकिन फिर आपको यह कोड अपने सभी व्यू मॉडेल में रखना होगा, न कि एक ही कक्षा में जिसे आसानी से बनाए रखा जा सकता है।

EDIT एक सेवा केवल एक कक्षा है जो आपके आईओसी कंटेनर में पंजीकृत है, और इसका उपयोग आपके व्यू मॉडल्स द्वारा किया जा सकता है।

public interface IProcessingService 
{ 
    void Process(Action<BackgroundWorker> action); 
    void Process(Action<BackgroundWorker> action, 
     Action<RunWorkerCompletedEventArgs> finish); 
} 

इसका उपयोग करके आपका व्यूमोडेल इस तरह कुछ कार्यान्वित कर सकता है।

{ 
    var processingService = container.Resolve<IProcessingService>(); 
    processingService.Process(worker => 
    { 
     worker.ReportProgress(0, "Please wait..."); 
     // Do work here 
     worker.ReportProgress(50); 
     // Do more work 
     worker.ReportProgress(100); 
    }); 
} 

इस तरह सभी प्रगति सूचना को प्रदर्शित करने के लिए अपने कोड वर्ग कि IProcessingService लागू करता है और अपने विचार किसी भी कोड है जो सीधे एक दृश्य या किसी UI तत्व को नियंत्रित करता है से मुक्त रहते हैं।

+0

क्या आप थोड़ा सा विस्तार करना चाहते हैं? जब आप कहते हैं 'एक सेवा का उपयोग कर समाप्त', मैं काफी पालन नहीं करता हूं। जाहिर है, मैं प्रक्रिया को संभालने के लिए एक डब्ल्यूसीएफ सेवा का उपयोग कर रहा हूं, एसएल सेवा को असंगत रूप से कॉल करता है, क्या आप कह रहे हैं कि एक और सेवा है जो डब्ल्यूसीएफ सेवा कहती है? मुझे वास्तव में एक ही स्थान पर 'प्रतीक्षा' स्क्रीन/कोड रखने का विचार पसंद है, यह आखिरकार मैं क्या कर रहा हूं। – billb

0

आप मध्यस्थ प्रोटोटाइप का उपयोग कर सकते हैं कि जोश स्मिथ ने वीएम से वी तक एक कमजोर युग्मित संदेश प्रणाली बनाई है। वीएम एक संदेश को धक्का दे सकता है कि यह "व्यस्त" है, इस दृश्य के साथ "IsBusy " संदेश।

तब दृश्य "IsNotBusy" संदेश प्राप्त होने तक सही संवाद दिखा सकता है।

एक और विकल्प कन्वर्टर में व्यूमोडेल को पास करना है, कुछ इंटरफेस जैसे IDialogProvider जिसमें संवाद दिखाने के तरीके हैं। इस प्रदाता का कार्यान्वयन विशिष्ट दिखाई देगा लेकिन कम से कम दृश्य मॉडल केवल इंटरफेस के बारे में जानता है, न कि ठोस कार्यान्वयन।

public interface IDialogProvider 
{ 
void ShowErrorMessage(string message); 
} 

Mediator Prototype

+0

आप उत्तर के लिए बहुत-बहुत धन्यवाद। मैंने मध्यस्थ लेख को दो बार पढ़ा और मुझे लगता है कि मुझे यह मिल गया है। लेकिन यह ओवरकिल की तरह लगता है। मुझे IDialogProvider पसंद है, लेकिन मैं अपने आप से एक बिंदु के बारे में लड़ रहा हूं, क्या यह वास्तव में यूआई प्रदर्शित करने के लिए व्यूमोडेल की ज़िम्मेदारी है? यदि नहीं, तो क्यों न केवल सब्सक्राइब करने के लिए ईवेंट की घटनाएं हैं और इसे तदनुसार यूआई प्रदर्शित करें? – billb

+0

यदि आप वीएम पर घटनाओं से जुड़ने के लिए दृश्य का उपयोग करते हैं, तो पहले स्थान पर वीएम क्यों है। IDialog प्रदाता किसी भी इंटरफ़ेस हो सकता है ताकि दृश्य को यह पता चल सके कि एक संवाद आवश्यक है। ShowErrorMessage को आप जो कुछ भी देखते हैं उसके साथ प्रतिस्थापित किया जा सकता है। –

3

मुझे लगता है कि दूसरों को हो सकता है यह एक ...

मैं Silverlight टूलकिट में BusyIndicator का उपयोग कर की सिफारिश करेंगे "overthinking" किया।

सरल XAML:

<toolkit:BusyIndicator Name="busyBoy" IsBusy="true" BusyContent="Fetching Data..." Margin="6,248,0,0" /> 
संबंधित मुद्दे