2012-05-31 18 views
9

के साथ सिंक से बाहर हो रही मैं किसी पाठ बॉक्स के साथ एक WPF दृश्य है, साथ UpdateSourceTrigger PropertyChanged करने के लिए सेट एक ViewModel करने के लिए पाठ क्षेत्र बाध्यकारी।WPF - MVVM - पाठ बॉक्स viewmodel संपत्ति

<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" /> 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     this.DataContext = new MainViewModel(); 
    } 
} 


public string Name 
{ 
    get { return _Name; } 
    set 
    { 
     if (_Name != value) 
     { 
      if (value.Length <= 10) 
      { 
       _Name = value; 
      } 
      RaisePropertyChanged("Name"); 
     } 
    } 
} 

मूल्य सेट नहीं है, मैं अभी भी RaisePropertyChanged (जो केवल PropertyChanged आग): ViewModel में संपत्ति सेटर में, मैं 10 अक्षर से अधिक से पाठ को रोकने के लिए एक सरल जांच की है।

समस्या यह है कि जब मैं यूआई में 11 वीं चरित्र में टाइप करें, मैं नाम_ अद्यतन नहीं करते है। मैं प्रॉपर्टी चेंज किया गया, और मैं देख सकता हूं कि एक्सेसर को कॉल किया जा सकता है और यह केवल 10 वर्णों के साथ स्ट्रिंग देता है। हालांकि, मेरा टेक्स्टबॉक्स इसे प्रतिबिंबित नहीं करता है; यह अभी भी 11 वर्णों के साथ स्ट्रिंग दिखाता है।

उस पर, यह है कि यदि 11 वें चरित्र पर मैं सेटर में पाठ को "त्रुटि" में बदलता हूं, और आग की संपत्ति बदल जाती है, तो टेक्स्टबॉक्स बदलते टेक्स्ट को दिखाने के लिए अद्यतन करता है।

तो क्यों करता है, तो मैं वापस पिछले मान को सेटर में पाठ को बदल, यूआई यह प्रतिबिंबित नहीं करता है कि यह क्या है?

मुझे पता है कि अधिकतम वर्णों को संभालने के वैकल्पिक तरीके हैं, लेकिन यह क्यों काम नहीं करेगा?

उत्तर

22

यह ढांचे में एक बग के अलावा कुछ भी नहीं है। TextTextBox में संपत्ति आपके नए मूल्य प्राप्त करती है लेकिन जीयूआई अब अपने TextProperty के साथ समन्वयित नहीं है। जब आप ViewModel से SelectedItem का परिवर्तन रद्द करना चाहते हैं तो यह ItemsControl के लिए भी खुश रहता है और यह वास्तव में कष्टप्रद है।

इस बग happend नहीं होती जब आप स्पष्ट Binding का उपयोग हालांकि तो यह एक समाधान के रूप में इस्तेमाल किया जा सकता।

Xaml

<TextBox Text="{Binding Path=MyName, 
         UpdateSourceTrigger=Explicit}" 
     TextChanged="TextBox_TextChanged"/> 

पीछे

private void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    TextBox textBox = sender as TextBox; 
    textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
} 

कोड सत्यापित करने के लिए कि पाठ बॉक्स जीयूआई वास्तव में सिंक्रनाइज़ेशन से बाहर है, बस TextBox.Text का मूल्य निरीक्षण। TextBox "123456789___0" कहेंगे उदाहरण के लिए TextBlock "123456789" कहता है।

<StackPanel> 
    <TextBox Name="myTextBox" 
      Text="{Binding Path=MyName, 
          UpdateSourceTrigger=PropertyChanged}"/> 
    <TextBlock Text="{Binding ElementName=myTextBox, Path=Text}"/> 
</StackPanel> 
+0

धन्यवाद! कोई विचार अगर यह मातृत्व को सूचित किया गया है? यदि नहीं, तो मैं करूँगा। –

+0

@ स्टेव ओसबोर्न: हाहा, मुझे यकीन नहीं है कि यह मातृत्व को सूचित किया गया है :) मैंने पहले देखा है लेकिन मुझे कुछ भी नहीं मिला है, लेकिन यह जानना थोड़ा मुश्किल है कि वास्तव में क्या खोजना है। आगे बढ़ें और इसकी रिपोर्ट करें, मुझे बताएं कि आपके पास कब है और मैं इसे ऊपर उठाऊंगा। –

+0

https://connect.microsoft.com/VisualStudio/feedback/details/745368/wpf-textbox-binding-doesnt-work-properly –

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