2012-05-31 71 views
9

私はTextBoxで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文字を超えるテキストを防止するための簡単なチェックを持っています。

UIの11番目の文字を入力すると_Nameが更新されないという問題があります。私はPropertyChangedを実行し、getアクセサが呼び出されるのを見ることができ、文字列は10文字しか返しません。しかし、私のTextBoxはこれを反映していません。それでも11文字の文字列が表示されます。

さらに、11番目の文字でセッターのテキストを「ERROR」に変更し、fireプロパティを変更した場合、TextBoxは更新されたテキストを表示するように更新します。

なぜ私は設定者のテキストを以前の値に戻すとUIにこれが反映されないのですか?

私は最大文字を扱う別の方法があると知っていますが、なぜこれは機能しませんか?

答えて

22

これはフレームワークのバグに過ぎません。 のTextプロパティは新しい値を取得しますが、GUIはそれ自身のTextPropertyと同期していません。これは、ViewModelからSelectedItemの変更を取り消したい場合にも、ItemsControlに起こります。本当に面倒です。

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のGUIが実際にちょうどTextBox.Textの値を調べ、同期していないことを確認します。例えば、が "123456789"と表示されている場合、TextBoxは "123456789___0"と表示されます。

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

ありがとうございます!これが母船に報告されているのであれば、どんな考えですか?そうでなければ、私はそうするでしょう。 –

+0

@SteveOsborn:母親に報告されているかどうか分かりません:)前に見たことがありますが、何も見つかりませんでしたが、正確に何を検索するのか少し難解です。それを報告して、あなたが持っているときに私に知らせてください、そして私はそれをupvoteします。 –

+0

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

関連する問題