2010-04-14 17 views
26

मुझे इन दो नियंत्रणों के साथ एक सरल WPF संवाद मिला है:डब्ल्यूपीएफ एमवीवीएम: टेक्स्टबॉक्स और डिफॉल्ट बटन बाइंडिंग बहुत देर हो चुकी है

<TextBox Text="{Binding MyText}"/> 
<Button Command="{Binding MyCommand}" IsDefault="True"/> 

अब, जब मैं टेक्स्टबॉक्स में कुछ टेक्स्ट डालता हूं और माउस का उपयोग करके बटन क्लिक करता हूं, तो सब कुछ अपेक्षित काम करता है: टेक्स्टबॉक्स MyText सेट करेगा और MyCommand कहा जाता है।

लेकिन जब मैं कुछ पाठ दर्ज करता हूं और डिफ़ॉल्ट बटन को "क्लिक" करने के लिए एंटर दबाता हूं, तो यह काम नहीं करता है। फोकस दर्ज करने पर ध्यान केंद्रित करने से टेक्स्टबॉक्स छोड़ नहीं जाता है, बाध्यकारी MyText रीफ्रेश नहीं किया जाएगा। तो जब MyCommand को कॉल किया जाता है (जो काम करता है), MyText में पुराना डेटा होगा।

मैं इसे एमवीवीएम में कैसे ठीक करूं? क्लासिक कोड-बैक में मैं शायद माईकॉमैंड हैंडलर में "MyButton.Focus()" को कॉल करूंगा, लेकिन एमवीवीएम में MyCommand हैंडलर को बटन के बारे में कुछ नहीं पता है।

तो अब क्या है?

उत्तर

30

ValueChanged मूल्य के साथ अपने टेक्स्टबॉक्स में UpdateSourceTrigger जोड़ें। टेक्स्टबॉक्स का डिफ़ॉल्ट व्यवहार स्रोत को अपडेट करना है, जब यह फोकस खो गया है।

<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}"/> 
+2

तो मुझे इसे प्रत्येक बाध्यकारी में जोड़ना होगा (क्योंकि हमेशा मेरे कीबोर्ड शॉर्टकट तक पहुंचने योग्य बटन हो सकते हैं)? – Sam

2

एक समाधान IST, अपनी खुद की कक्षा OKButton कि OnClick-विधि में Me.Focus कॉल बनाने के लिए। इसे Click_Event से पहले और बटन से बाध्य किसी भी कमांड से पहले बुलाया जाएगा। आपको बस IsDefault = True

Public Class OKButton 
    Inherits System.Windows.Controls.Button 

    Public Sub New() 
    MyBase.New() 
    Me.Content = "OK" 
    Me.IsDefault = True 
    End Sub 

    Protected Overrides Sub OnClick() 
    Me.Focus() 
    MyBase.OnClick() 
    End Sub 
End Class 
+0

बटन के बारे में क्या जो डिफ़ॉल्ट बटन नहीं हैं और उनके alt-शॉर्टकट का उपयोग कर सक्रिय हैं? यह उनके लिए काम नहीं करेगा। – Sam

5

सेट करने के बजाय ओकेबटन का उपयोग करना याद रखना होगा। यह कोड क्लिक बटन पर ध्यान केंद्रित करता है। इस प्रकार बाध्यकारी संसाधित आदेश से पहले पूरा करता है।

public App() 
    { 
     EventManager.RegisterClassHandler(typeof(Button), Button.ClickEvent, new RoutedEventHandler(GenericButtonClickHandler)); 
    } 

    void GenericButtonClickHandler(object sender, RoutedEventArgs e) 
    { 
     var button = sender as Button; 
     if (button == null) 
      return; 
     if (button.IsDefault) 
      button.Focus(); 
    } 
+0

बटन के बारे में क्या जो डिफ़ॉल्ट बटन नहीं हैं और उनके alt-शॉर्टकट का उपयोग करके सक्रिय हैं? यह उनके लिए काम नहीं करेगा। – Sam

+0

हां, सैम। आप सही 'अगर (बटन। आईएसडीफॉल्ट) सामान्य समाधान के लिए लागू नहीं है। – Aleks

+0

लेकिन इस समाधान का विचार एक ही स्थान पर एक बटन पर ध्यान केंद्रित करने और सेट करने से पहले सभी क्लिक पकड़ लेता है। लेकिन पूरे एप्लिकेशन के माध्यम से किसी भी संपादन योग्य नियंत्रण में 'UpdateSourceTrigger' का उपयोग नहीं कर रहा है। – Aleks

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