2010-12-07 15 views
5

मेरे पास कई ग्राफ और एक शीर्ष पर नियंत्रण नियंत्रण वाला सिल्वरलाइट ऐप है जो उपयोगकर्ता को दिनांक सीमा निर्धारित करने की अनुमति देता है (उदाहरण के लिए 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 
} 

उत्तर

1

मैं अपनी स्थिति को संक्षेप में प्रस्तुत करने की कोशिश करेंगे:

  • तो डेटा श्रेणी बदल गया है - ही दिखाई रेखांकन किया जाना चाहिए अपडेट किया गया।
  • यदि कोई ग्राफ दिखाई देता है - इसे तुरंत अपडेट करना चाहिए।

इसलिए दृश्यता संपत्ति की स्पष्ट आवश्यकता है।

पहला बिंदु के लिए समाधान: RunQueries विधि में कमांड के निष्पादन की संभावना की जांच करें।

दूसरे बिंदु के लिए समाधान: दृश्यता संपत्ति के एक सेटटर में आदेश निष्पादित करें।

यहाँ उदाहरण है:

private DelegateCommand UpdateData1Command { get; set; } 

    public MyViewModel() 
    { 
     this.UpdateData1Command = new DelegateCommand(_ => this.GetData1(), _ => this.IsGraph1Visible); 
    } 

    private bool isGraph1Visible; 

    public bool IsGraph1Visible 
    { 
     get { return isGraph1Visible; } 
     set 
     { 
      isGraph1Visible = value; 
      OnPropertyChanged("IsGraph1Visible"); 

      if(UpdateData1Command.CanExecute(null)) 
       UpdateData1Command.Execute(null); 
     } 
    } 

    private void RunQueries() 
    { 
     if (UpdateData1Command.CanExecute(null)) 
      UpdateData1Command.Execute(null); 
    } 

    private void GetData1() 
    { 
     // call wcf service to get the data 
    } 

प्रत्येक ग्राफ अब गुण है डाटा, IsVisible, UpdateDataCommand और विधि GetData। मैं उन्हें एक अलग दृश्य मॉडल में स्थानांतरित करने की अनुशंसा करता हूं।

+0

उत्कृष्ट उत्तर और एक महान डिजाइन! मैंने आदेशों का उपयोग करने के बारे में सोचा नहीं होगा, लेकिन यह वास्तव में एक अच्छा फिट है और किसी बिंदु पर "डेटा रीफ्रेश करें" बटन को लागू करने के लिए इसे बहुत आसान बना देगा। धन्यवाद! – MCS

+0

आप इस मामले में एकाधिक व्यूमोडेल कक्षाओं का उपयोग करने का सुझाव कैसे देंगे, जहां कुछ डेटा (जैसे डेटरेंज) को साझा करने की आवश्यकता है? रचना का प्रयोग करें और प्रत्येक ग्राफ के व्यूमोडेल में साझा व्यूमोडेल का संदर्भ है? या किसी प्रकार की विरासत का उपयोग करें? – MCS

+0

हां, किसी डेटरेंज संपत्ति को अन्य व्यूमोडेल में जोड़ना आवश्यक है। संभावित तरीकों में से एक निर्भरता प्रॉपर्टीज दोनों व्यूमोडल्स में और एक संपत्ति को दूसरे में बाध्य करने का उपयोग कर रहा है। लेकिन इसके लिए निर्भरता ऑब्जेक्ट की विरासत की आवश्यकता होती है और कभी-कभी असुविधाजनक हो सकती है। इसलिए मैं संपत्ति के सेटर के अंदर फोरैच लूप का उपयोग करूंगा MyViewModel.DateRange, इस तरह कुछ: foreach (इस में ग्राफViewModel vm.GraphModels) vm.UpdateDateRange (मान); – vorrtex

संबंधित मुद्दे