2010-09-22 11 views
5

, मैं RoutedCommands कि मैं निम्नलिखित कोड के माध्यम से मेरी XAML में उल्लेख करने के लिए उपयोग करें:WPF कस्टम ICommand कार्यान्वयन और मेरे WPF UI में CanExecuteChanged घटना

Command="viewModel:MessageListViewModel.DeleteMessagesCommand" 

मैं अपने ViewModel वर्ग को यह स्थिर लिंक पसंद नहीं है , मुझे लगता है कि यह एक कस्टम ICommand कार्यान्वयन बनाने के रूप में के रूप में अच्छा नहीं है और जैसे निम्नलिखित

Command="{Binding DeleteMessagesCommand}" 

करने के बाद एक बनाए गए एक वाक्य विन्यास का उपयोग, मुझे लगता है मैं क्या किया है में से एक बड़ी खामी नोटिस: RoutedCommands CommandManager और (का उपयोग किसी भी तरह से यह मेरे लिए पूरी तरह से अपारदर्शी है) आग CommandManager.Requery सुझाया गया ईवेंट, ताकि उनके CanExecute विधि को स्वचालित रूप से आवश्यक हो। मेरे कस्टम कार्यान्वयन के लिए, CanExecute केवल स्टार्टअप पर एक बार निकाल दिया जाता है और उसके बाद कभी नहीं।

क्या किसी के पास इसके लिए एक शानदार समाधान है? इस प्रकार

उत्तर

8

बस CanExecuteChanged घटना को लागू:

public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 

जब आप किसी को नियंत्रित करने के आदेश असाइन करते हैं, यह CanExecuteChanged घटना का सदस्य बनता। यदि आप इसे CommandManager.RequerySuggested ईवेंट पर "रीडायरेक्ट" करते हैं, तो CommandManager.RequerySuggested ट्रिगर होने पर नियंत्रण अधिसूचित किया जाएगा।

+0

धन्यवाद इस महान और संक्षिप्त उत्तर के लिए एक गुच्छा! एक जादू की तरह काम करता है। क्या आप किसी भी मौके से जानते हैं कि कब और क्यों अनुरोध किया जाता है? –

+1

बिल्कुल नहीं, लेकिन मुझे अक्सर ऐसा लगता है ... –

+0

ठीक है, बहुत बहुत धन्यवाद! –

0

मैं व्यूमोडेल बाइंडिंग (http://msdn.microsoft.com/en-us/library/ff654132.aspx) के लिए प्रिज्म के प्रतिनिधिमंडल कार्यान्वयन को बहुत पसंद करता हूं। आप RaiseCanExecute पर कॉल करके प्रत्येक कमांड इनवॉकर पर CanExecute() का आह्वान कर सकते हैं।

सरल उपयोग का उदाहरण:

public class ViewModel 
{ 
    public ViewModel() 
    { 
     Command = new DelegateCommand<object>(x => CommandAction(), x => CanCommandAction()); 
    } 

    bool state; 

    public void ChangeState(bool value) 
    { 
     state = value; 
     Command.RaiseCanExecuteChanged(); 
    } 

    public DelegateCommand<object> Command {get; private set;} 

    private void CommandAction() 
    { 
     //do smthn 
    } 

    private bool CanCommandAction() { return true == state; } 
} 

//and binding as usual 
Command="{Binding Command}" 
+0

विचार के लिए धन्यवाद, लेकिन - जैसा कि हमने सीखा है - "महान शक्ति के साथ बड़ी ज़िम्मेदारी आती है" ... –

+0

क्षमा करें, बहुत जल्द दर्ज करें दबाएं। मेरा मतलब यह है कि: मुझे मौका देने के दौरान, यह अधिसूचित होने के लिए मुझे ऐसा करने के लिए भी मजबूर करता है। –