2009-11-17 16 views
6

मैं TreeView आइटम के लिए एक टेम्पलेट है।WPF CommandParameter बंधन और canExecute

समस्या है: अगर मैं का उपयोग DelegateCommand CanExecutedMethod साथ 'जोड़ें':

AddRate = new DelegateCommand<int?>(AddExecute,AddCanExecute); 

इसकी केवल एक बार कहा जाता है और पैरामीटर रिक्त है (जबकि TextBlock उचित ID मान दिखाता है)। IDE संपत्ति को कॉल करने से पहले CanExecute कहा जाता है (डीबगर के साथ चेक किया गया)। ऐसा लगता है कि वास्तविक पैरामीटर के लिए बाध्यकारी होने से पहले wpf आविष्कार कर रहा है और इसके बारे में भूल जाता है। एक बार बाध्यकारी समाप्त होने और उचित मूल्य लोड होने पर यह फिर से CanExecute को कॉल नहीं करता है।

एक समाधान के साथ मैं आदेश का उपयोग कर सकते हैं केवल प्रतिनिधि पर अमल के रूप में:

Add = new DelegateCommand<int?>(AddExecute); 

AddExecute सही आईडी मूल्य के साथ शुरू हो जाती है और पूरी तरह से काम कर रहा है। लेकिन मैं अभी भी CanExecute कार्यक्षमता का उपयोग करना चाहता हूँ। कोई विचार?

उत्तर

4

इस परिदृश्य में, आदेश के लिए पैरामीटर के रूप में उपयोग की जाने वाली संपत्ति पर RaiseCanExecuteChanged() को कॉल करना बेहतर है। आपके मामले में, यह आपके व्यूमोडेल में आईडी प्रॉपर्टी होगी (या जो भी डेटा कॉन्टेक्स्ट आप उपयोग कर रहे हैं)।

वह कुछ इस तरह होगा:

private int? _id; 
public int? ID 
{ 
    get { return _id; } 
    set 
    { 
     _id = value; 
     DelegateCommand<int?> command = ((SomeClass)CalcEditView.DataContext).Add; 
     command.RaiseCanExecuteChanged(); 
    } 
} 

प्रभाव अपने समाधान के रूप में ही हो जाएगा, लेकिन इसके बारे में कोड-पीछे बाहर कमान तर्क रहता है।

1

मैं पैरामीटर का उपयोग object के रूप में करता हूं और फिर इसे int पर डाल देता हूं।

Add = new DelegateCommand<object>(add, canAdd); 

और ऐड विधि में

void add(object parameter){ 
    int id = Convert.ToInt32(parameter); 

    //or simply 

    int id2 = (int)parameter; 

    //... 
    // do your stuff 
    //... 
} 
संबंधित मुद्दे