2011-03-14 11 views
39

मुझे गैलासोफ्ट एमवीवीएम लाइट फ्रेमवर्क का उपयोग करके रिलेकॉमैंड में पैरामीटर पास करने में कोई समस्या है। मुझे पता है कि relaycommand की MVVM प्रकाश के कार्यान्वयन लैम्ब्डा पैरामीटर का उपयोग नहीं करता है, तो मैं कुछ शोध किया और एक तरह से है कि लोगों को कुछ इस तरह करने से उसके चारों ओर काम किया पाया:एमवीवीएम लाइट रिले कॉमांड पैरामीटर

public RelayCommand ProjMenuItem_Edit 
{ 
    get 
    { 
     if (_projmenuItem_Edit == null) 
     { 
      //This should work.... 
      _projmenuItem_Edit = new RelayCommand(ProjEditNode); 
     } 
     return _projmenuItem_Edit; 
    } 
} 

private void ProjEditNode(object newText) 
{ 
    var str = newText as string; 
    OrganLocationViewModel sel = 
     ProjectOrganLocationView.GetExtendedTreeView().GetTopNode(); 

    //Console.WriteLine(sel.OrganDisplayName); 
    sel.OrganDisplayName = str; 
} 

हालांकि, मैं पर एक त्रुटि प्राप्त हो रही लाइन _projmenuItem_Edit = new RelayCommand(ProjEditNode); जो कहती है Argument 1: cannot convert from 'method group' to 'System.Action'

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

उत्तर

76

मेरा मानना ​​है कि यह काम करेगा:

_projmenuItem_Edit = new RelayCommand<object>((txt)=>ProjEditNode(txt)); 

- संपादित करें -

साथ ही आप प्रकार के साथ अपने RelayCommand निर्धारित करने होंगे:

उदा

public RelayCommand<string> myCommand { get; private set; } 
myCommand = new RelayCommand<string>((s) => Test(s)); 

private void Test(string s) 
{ 
    throw new NotImplementedException(); 
} 
+0

मैं इस पहले देखा है अपने कोड को कम करने में मदद मिलेगी और यह कोशिश की है , लेकिन ऐसा लगता है कि गैलासोफ्ट के रिले कॉमांड में रिलेकॉमैंड कार्यान्वयन शामिल नहीं है? मुझे यह त्रुटि मिलती है जब मैं RelayCommand का प्रयास करता हूं: 'GalaSoft.MvvmLight.Command.RelayCommand ' से 'GalaSoft.MvvmLight.Command.RelayCommand' – Saggio

+0

गह, मैंने संपादित करने की कोशिश की लेकिन बहुत देर हो चुकी थी ... को अस्वीकार कर दिया पिछली टिप्पणी, मैं relproCommand टाइप करने के लिए _projmenuItem_Edit को भी बदलना भूल गया: पी – Saggio

+2

मैंने जवाब भी अपडेट किया, किसी और के लिए जो इसमें चल रहा है। :) – Robaticus

4

मुझे नहीं लगता कि RelayCommand() में एक कन्स्ट्रक्टर है जो खाली नहीं है। आप गलत तरीके की विधि को पारित करने की कोशिश कर रहे हैं।

यदि आप रिलेकॉमैंड को कमांड पैरामीटर्स का समर्थन करना चाहते हैं, तो आपको RelayCommand<T> का उपयोग करना चाहिए जहां टी किसी भी प्रकार का पैरामीटर हो सकता है। आपकी स्थिति में यह RelayCommand<String> होगा जो शून्य (स्ट्रिंग) हस्ताक्षर के साथ एक विधि स्वीकार करेगा। (और वजह यह भी दृढ़ता से टाइप किया जाएगा और बदसूरत वस्तु का उपयोग नहीं होगा)

1

एक और तरीका है रिले आदेशों घोषित करने के लिए,

public RelayCommand ChartCommand 
{ 
    set 
    { 
     RelayCommand<string> chartCommand = 
      new RelayCommand<string>(e => ExecuteChartCommand(e));    
    } 
} 

public void ExecuteChartCommand(string vendor) 
{ 

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