2010-02-18 16 views
9

मेरे पास एक UserControl है जो एक विशिष्ट कमांड को संभालने के लिए कमांड बाइंडिंग संग्रह में कमांड बाइंडिंग जोड़ता है। बाद में मैं इस नियंत्रण का उपयोग एक खिड़की में करता हूं और अतिरिक्त व्यवहार जोड़ने के लिए उसी नियंत्रण में एक और बाध्यकारी जोड़ना चाहता हूं। समस्या यह है कि, जब मैं ऐसा करता हूं ऐसा लगता है कि जब मैं कमांड बाइंडिंग्स को एक नियंत्रण के संग्रह में एक और कमांड बाइंडिंग जोड़ता हूं, तो यह किसी भी बाध्यकारी को प्रतिस्थापित करता है जो पहले से ही उसी कमांड के लिए बनाया गया था। तो ऐसा लगता है कि एक नियंत्रण में प्रति नियंत्रण केवल एक कमांडबाइंडिंग हो सकती है, क्या यह सही है?क्या मेरे पास एक ही नियंत्रण के लिए एक ही कमांड के लिए एकाधिक कमांडबिंडिंग हो सकती है?

कृपया नीचे दिए गए कोड उदाहरण को देखें, जो एक ही सहेजें कमांड के लिए दो कमांडबिंडिंग सेट करने का प्रयास करता है।

<Window x:Class="MultipleCommandBindings.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Window.CommandBindings> 
    <CommandBinding Command="Save" 
        Executed="CommandBinding_Executed" /> 
    <CommandBinding Command="Save" 
        Executed="CommandBinding_Executed" /> 
</Window.CommandBindings> 
<Grid> 
    <Button Height="23" 
      HorizontalAlignment="Right" 
      Margin="0,0,25,88" 
      Name="button1" 
      VerticalAlignment="Bottom" 
      Width="75" 
      Command="Save">Button</Button> 
</Grid> 

मूल रूप से मैं या तो एक संकलन समय या क्रम अपवाद उम्मीद कर रहा था जब इस कोड को लिखा था लेकिन आश्चर्य है कि यह शिकायत नहीं किया। इसके बावजूद मैं निराश था क्योंकि मेरे कमांड बाइंडिंग_एक्सेटेड हैंडलर को केवल दो बार के बजाय बुलाया जाता है क्योंकि मैं उम्मीद कर रहा था।

अद्यतन: परीक्षण ऐसा लगता है कि मेरी दूसरी CommandBinding मेरा पहला एक अधिलेखित नहीं कर रहा है, लेकिन इसके बजाय ऐसा लगता है कि कर रहा हूँ, भले ही मैं सच करने के लिए अपने ईवेंट हैंडलर में रखरखाव वाले सेटिंग नहीं है कि पहली आदेश बाध्यकारी का एक सा होने के बाद कमांड निगलो। मुझे इस बात पर बहुत यकीन है कि मेरी समस्या का हल यह समझना है कि क्यों रूट किया गया आदेश पहले हैंडलर के पीछे प्रचार नहीं कर रहा है, भले ही हैंडल सही पर सेट न हो।

अद्यतन: मैं जानकारी जो सिर्फ WPF में कमान मार्ग के पीछे अजीब व्यवहार के कुछ की पुष्टि करता है की this great little tidbit पाया है।

अद्यतन: कैसे तथ्य ऐसा लगता है कि यह है कि वहाँ केवल आदेश के अनुसार एक भी प्रभावी CommandBinding हो सकता है हल करने के तरीके के बारे में एक विचार है कि ऐसा लगता है कि डिफ़ॉल्ट CommandBinding वर्ग निष्पादित और CanExecute घटनाओं निश्चित रूप से जो के रूप में उजागर करता है जैसे सभी घटनाओं में एकाधिक हैंडलर हो सकते हैं। तब विचार मानक कमांडबिंडिंग से कुछ और तरीका है। कमांडर को कमांडर जोड़ने के लिए विधि जोड़ें। हो सकता है कि यह नियंत्रण वर्ग पर एक विस्तार विधि के माध्यम से किया जा सके और एक कस्टम कंपोजिट कॉमांड बाइंडिंग क्लास के साथ संयोजन जो हमें एक मुख्य बाध्यकारी के भीतर कई बाइंडिंग को एकत्र करने की अनुमति देता है।

+0

एकमात्र समाधान जिसे मैं सोच सकता हूं वह बटन के क्लिक ईवेंट की सदस्यता लेना है और फिर व्यू के डेटाकॉन्टेक्स्ट को इसके व्यूमोडेल के रूप में डालना है और मैन्युअल रूप से 2 कमांड निष्पादित करने के लिए उस var का उपयोग किया जाता है। इस विचार के लिए –

उत्तर

1

मुझे आपके प्रश्न का उत्तर नहीं पता है, लेकिन प्रतिबिंबक का उपयोग करना मेरे लिए उचित लगता है।

मुझे आश्चर्य है कि आप ऐसा क्यों कर रहे हैं? शायद यह व्यवहार करने के लिए Composite पैटर्न का उपयोग करने के लिए अधिक समझ में आता है, बल्कि कमांड बाइंडिंग को गठबंधन करने की कोशिश कर रहा है?

+1

+1 कि आपके पास दृश्य में केवल 1 बाध्यकारी होना चाहिए और स्टैक के नीचे कई व्यवहारों को आगे बढ़ाया जाना चाहिए। –

+0

ठीक है, मेरे मामले में मेरे पास एक उपयोगकर्ता नियंत्रण है जो कई अलग-अलग प्रकार के आदेशों का स्रोत हो सकता है जो एक आंतरिक नियंत्रण से प्रचारित हो जाते हैं। उपयोगकर्ता नियंत्रण में मैं इस बारे में जागरूक होना चाहता हूं कि इनमें से कोई भी आदेश जारी किया गया है ताकि मैं अपना व्यूमोडेल कुछ अन्य प्रक्रियाएं शुरू कर सकूं जिनके अंतिम परिणाम मेरे उपयोगकर्ता नियंत्रण (व्यू) के माध्यम से सामने आएंगे। मैं उस संपत्ति से जुड़ा हूं जिसे मैं उजागर कर रहा हूं और देख सकता हूं कि जब यह उपयोग करने के लिए तैयार है, तो यह पता लगाने के लिए कि जब यह उपयोग करने के लिए तैयार है, लेकिन मैं पूरी प्रक्रिया शुरू करने वाले वास्तविक कमांड प्रकार के बारे में जानकारी देखता हूं। – jpierson

3

अभी तक मैं केवल इस समस्या के लिए एक समाधान के साथ आने में सक्षम हूं जो तार्किक पेड़ में दो अलग-अलग स्तरों पर कमांड को संभालने के लिए है। नीचे दिए गए उदाहरण में मैं अपने ग्रिड के भीतर सेव कमांड को नियंत्रित करता हूं और फिर विंडो तत्व के भीतर भी।

<Window x:Class="MultipleCommandBindings.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Window.CommandBindings> 
    <CommandBinding Command="Save" 
        Executed="CommandBinding_Executed2"/> 
</Window.CommandBindings> 
<Grid> 
    <Grid.CommandBindings> 
     <CommandBinding Command="Save" 
         Executed="CommandBinding_Executed1" /> 
    </Grid.CommandBindings> 

    <Button Height="23" 
      HorizontalAlignment="Right" 
      Margin="0,0,25,88" 
      Name="button1" 
      VerticalAlignment="Bottom" 
      Width="75" 
      Command="Save">Button</Button> 
</Grid> 

आदेश में इस के पीछे मेरे कोड काम करने के लिए प्राप्त करने के लिए मैन्युअल रूप से भी अगले स्तर अप करने के लिए कमान निष्पादन का प्रचार करने की जरूरत है।

private void CommandBinding_Executed1(object sender, ExecutedRoutedEventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine("Executed 1!"); 
     var command = e.Command as RoutedUICommand; 
     command.Execute(e.Parameter, this); 
    } 

    private void CommandBinding_Executed2(object sender, ExecutedRoutedEventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine("Executed 2!"); 
    } 

अगर किसी को कैसे मैं एक आदेश निगरानी कर सकते हैं पर किसी भी बेहतर विचार है अभी भी यह पेड़ मैं इसे अन्यथा मैं तो बस इस समाधान का सहारा हो सकता है देखने के लिए प्यार होता अप स्वाभाविक रूप से प्रचार करते हैं।

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

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