2010-09-22 11 views
12

जोश स्मिथ के RelayCommand, उदाहरण के सबसे मैंने देखा है उपयोग आलसी जैसे आरंभीकरण उपयोग करते समय:रिलेकॉमैंड आमतौर पर आलसी प्रारंभिकरण का उपयोग क्यों करते हैं?

public class ViewModel 
{ 
    private ICommand myCommand; 

    public ICommand MyCommand 
    { 
     get 
     { 
      if (myCommand == null) 
      { 
       myCommand = new RelayCommand(p => DoSomething()); 
      } 

      return myCommand; 
     } 
    } 
    // ... stuff ... 

} 

बल्कि निर्माता में RelayCommand बनाने, इस तरह से:

public class ViewModel 
{ 
    public ViewModel() 
    { 
      MyCommand = new RelayCommand(p => DoSomething()); 
    } 

    public ICommand MyCommand 
    { 
     get; 
     private set; 

    } 

    // ... stuff ... 
} 

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

क्या मुझे यहां कुछ याद आ रही है?

+0

आप सही हैं। RoutedCommands की आलसी शुरुआत कोई समझ नहीं लेती क्योंकि वे बहुत हल्के होते हैं और जैसे ही दृश्य इसे बाध्य करता है, वैसे भी वे लोड होते हैं। – jbe

उत्तर

15

वास्तव में, WPF और Silverlight रिले आदेश सिर्फ एक बार बंधन प्रति, मिल जाएगा ताकि आप वास्तव में एक समर्थन क्षेत्र स्टोर करने के लिए की जरूरत नहीं है:

public ICommand MyCommand 
{ 
    get 
    { 
     return new RelayCommand(p => DoSomething()); 
    } 
} 

तो में इसे बनाने के साथ कुछ भी गलत नहीं है, जबकि जैसा कि आप सुझाव देते हैं .क्टर, बहुत कम कारण है।

+2

_ "डब्ल्यूपीएफ और सिल्वरलाइट प्रति बाध्यकारी केवल एक बार रिले कमांड प्राप्त करेगा" _ - मुझे अभ्यास में पता है यह सच है। लेकिन, यह देखते हुए कि दस्तावेज इस व्यवहार को _promise_ नहीं करता है, क्या यह वास्तव में संपत्ति मूल्य को पुनर्प्राप्त करने के लिए हर बार एक नई वस्तु बनाने के लिए बुद्धिमान है? उस दिन क्या होता है जब माइक्रोसॉफ्ट, किसी भी कारण से, यह निर्णय लेता है कि यह आपके मॉडल ऑब्जेक्ट को कमांड ऑब्जेक्ट रेफरेंस को कहीं भी कैशिंग करने के बजाय रखने के लिए और अधिक समझ में आता है, और जब भी उन्हें इसकी आवश्यकता होती है तो वे संपत्ति से मूल्य प्राप्त करते हैं? –

+2

@ पीटर डिनिहो: न केवल माइक्रोसॉफ्ट; मेरा व्यू मॉडल हर समय अपने आदेशों से सीधे अपने आदेश (और CanExecute()) को कॉल करता है। तो, नहीं, हर बार एक नया उदाहरण बनाने के लिए मूर्ख नहीं होगा। – BoltClock

+0

@ बोल्टक्लॉक: अच्छा बिंदु। मैं [अन्य पोस्ट] में स्थित परिदृश्यों के बारे में अधिक स्पष्ट होगा (https://stackoverflow.com/a/46420039) –

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