मेरे पास कई ग्राफ और एक शीर्ष पर नियंत्रण नियंत्रण वाला सिल्वरलाइट ऐप है जो उपयोगकर्ता को दिनांक सीमा निर्धारित करने की अनुमति देता है (उदाहरण के लिए 1 जुलाई - 30 सितंबर)।सिल्वरलाइट व्यू मॉडेल क्लास में डेटा पूछताछ को कैसे रोकें?
असल में, जब कोई उपयोगकर्ता दिनांक सीमा को संशोधित करता है, तो एक आदेश निष्पादित किया जाता है जो व्यूमोडेल की DateRange
संपत्ति को नए मान पर सेट करता है। DateRange
के सेटर RunQueries
विधि को कॉल करता है जो नए डेटा के लिए पूछताछ करता है और उन प्रश्नों के परिणामों के साथ Data1
और Data2
गुण सेट करता है। Data1
या Data2
से जुड़े ग्राफ़ तदनुसार अपडेट हो जाते हैं। मूल व्यूमोडेल कोड के लिए नीचे देखें; DateRange
सेटर में RunQueries
विधि कॉल का ध्यान रखें।
वास्तव में, पहले से ही दो से अधिक डेटा संग्रह हैं और ऐप का विस्तार होने के साथ ही जोड़ा जा रहा है। इसके अलावा, सभी ग्राफ एक बार में दिखाई नहीं दे रहे हैं; कभी-कभी केवल एक ग्राफ दिखाई देता है। लेकिन जब उपयोगकर्ता दिनांक सीमा बदलता है, तो किसी भी ग्राफ के लिए आवश्यक सभी डेटा प्राप्त करने के लिए सभी प्रश्न नई शुरुआत और समाप्ति तिथियों के साथ पुन: चालू होते हैं। यह मेरे लिए बहुत अक्षम लगता है - शायद केवल एक प्रश्न चलाने की जरूरत है!
तो मेरा सवाल है - मैं अपने व्यूमोडेल क्लास में देरी डेटा पूछताछ कैसे कार्यान्वित कर सकता हूं?
- रखें ट्रैक जिनमें से डेटा संग्रह करने की तारीख कर रहे हैं और फिर डेटा गेटर विधि में जाँच करता है, तो कोई क्वेरी चलाने के होने की जरूरत है:
यहाँ दो विचारों मैं पर विचार किया गया है।
- व्यूमोडेल को कई उप-वर्गों में विभाजित करें, प्रत्येक ग्राफ के लिए एक, और प्रत्येक व्यूमोडेल को बेस श्रेणी के साथ डेट्रेंज का ट्रैक रखने के साथ अपना डेटा प्रबंधित करें।
दोनों विचार लागू करने के लिए जटिल लगते हैं और मैं सोच रहा हूं - क्या इसके लिए एक मानक दृष्टिकोण है? क्या मुझे एमवीवीएम डिजाइन पैटर्न में कुछ याद आ रहा है जो इस मुद्दे को संबोधित करता है?
यहाँ मेरी ViewModel वर्ग के बहुत सरलीकृत संस्करण है:
public class MyViewModel: INotifyPropertyChanged
{
private ObservableCollection<MyData> _Data1;
private ObservableCollection<MyData> _Data2;
private MyDateRange _DateRange;
public ObservableCollection<MyData> Data1
{
get
{
return _Data1;
}
set
{
if (_Data1 != value)
{
_Data1 = value;
NotifyPropertyChanged("Data1");
}
}
}
// getter and setter for Data2 go here
public MyDateRange DateRange
{
get
{
return _DateRange;
}
set
{
if (_DateRange != value)
{
_DateRange = value;
NotifyPropertyChanged("DateRange");
// if date range changed, need to query for stats again
RunQueries();
}
}
}
private void RunQueries()
{
GetData1();
GetData2();
}
private void GetData1()
{
// call wcf service to get the data
}
private void GetData1Completed(object s, EventArgs e)
{
// update Data1 property with results of service call
}
// etc
}
उत्कृष्ट उत्तर और एक महान डिजाइन! मैंने आदेशों का उपयोग करने के बारे में सोचा नहीं होगा, लेकिन यह वास्तव में एक अच्छा फिट है और किसी बिंदु पर "डेटा रीफ्रेश करें" बटन को लागू करने के लिए इसे बहुत आसान बना देगा। धन्यवाद! – MCS
आप इस मामले में एकाधिक व्यूमोडेल कक्षाओं का उपयोग करने का सुझाव कैसे देंगे, जहां कुछ डेटा (जैसे डेटरेंज) को साझा करने की आवश्यकता है? रचना का प्रयोग करें और प्रत्येक ग्राफ के व्यूमोडेल में साझा व्यूमोडेल का संदर्भ है? या किसी प्रकार की विरासत का उपयोग करें? – MCS
हां, किसी डेटरेंज संपत्ति को अन्य व्यूमोडेल में जोड़ना आवश्यक है। संभावित तरीकों में से एक निर्भरता प्रॉपर्टीज दोनों व्यूमोडल्स में और एक संपत्ति को दूसरे में बाध्य करने का उपयोग कर रहा है। लेकिन इसके लिए निर्भरता ऑब्जेक्ट की विरासत की आवश्यकता होती है और कभी-कभी असुविधाजनक हो सकती है। इसलिए मैं संपत्ति के सेटर के अंदर फोरैच लूप का उपयोग करूंगा MyViewModel.DateRange, इस तरह कुछ: foreach (इस में ग्राफViewModel vm.GraphModels) vm.UpdateDateRange (मान); – vorrtex