2012-05-31 19 views
9

TextBox'a sahip bir WPF görünümüm var, Text alanını bir SharePoint'e bağlayarak UpdateSourceTrigger özelliği PropertyChanged olarak ayarlanmış. değer ayarlanmazsa WPF - MVVM - Textbox viewmodel özelliği ile eşitleme dışı oluyor

<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"); 
     } 
    } 
} 

, hala RaisePropertyChanged (basitçe PropertyChanged ateşler olan): ViewModel mülkiyet setter, ben 10 karakteri aşan metin önlemek için basit bir çek var.

Sorun, kullanıcı arayüzünde 11. karakteri yazdığımda _Name değerini güncellemem. PropertyChanged'ı görevlendiririm ve get accessor'un çağrıldığını görebiliyorum ve dizeyi sadece 10 karakterle döndürüyor. Ancak, TextBox'um bunu yansıtmıyor; hala 11 karakterli dizgiyi gösterir.

Bunun üzerine, eğer 11. karakterde, setterdeki metni "ERROR" olarak değiştiririm ve fire özelliği değişti, TextBox, değiştirilen metni göstermek için update yapar.

Öyleyse neden, dizideki metni önceki değere geri döndürürsem, UI bunu yansıtmıyor?

Maksimum karakterleri ele almanın alternatif yolları olduğunu biliyorum, ancak neden bu işe yaramayacak?

cevap

22

Bu, çerçevedeki bir hatadan başka bir şey değildir. TextBox'daki Text özelliği, yeni değerinizi alıyor, ancak GUI artık kendi TextProperty ile eşitlenemiyor. Bu, ViewModel'den SelectedItem bir değişikliği iptal etmek istediğinizde, ItemsControl için de geçerlidir ve gerçekten can sıkıcıdır.

Bu hata, açık bir Binding kullandığınız halde, bu bir geçici çözüm olarak kullanılabilecek şekilde kullanıldığında gerçekleşmez.

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

arkasında

Xaml

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

Kod TextBox GUI gerçektendir senkronizasyon dışı, sadece TextBox.Text değerini gözlemlemek doğrulamak için. TextBox, örneğin "123456789___0" diyecek, TextBlock ise "123456789" yazıyor.

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

Teşekkürler! Bunun anababaya bildirilip bildirilmediği hakkında bir fikrin var mı? Olmazsa ben yaparım. –

+0

@SteveOsborn: Haha, bunun annesine bildirilmiş olup olmadığından emin değilim :) Daha önce baktım ama hiçbir şey bulamadım ama tam olarak ne arayacağımı bilmek biraz zor. Devam et ve rapor et, bana sahip olduğun zaman haber ver ve onu tekrar yazacağım. –

+0

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