2012-09-05 8 views
5

WPFアプリケーションでは、キーボードショートカットをカスタマイズするための設定ウィンドウを作成しています。WPFでバインディングを失うことなくTextBox.Textを変更するにはどうすればよいですか?

テキストボックスではKeyDownイベントを処理し、Keyイベントを人間が判読できる形式(およびデータを保持する形式)に変換します。

テキストボックスには、この

<TextBox Text="{Binding ShortCutText, Mode=TwoWay}"/> 

のように宣言され、イベントハンドラで、私はこれらの例の両方で両方

(sender as TextBox).Text = "..."; 

(sender as TextBox).Clear(); 
(sender as TextBox).AppendText("..."); 

を使用してみました、ビューモデルへのバインディングが機能しない場合、ビューモデルにはまだ古いデータが含まれており、更新されません。 (viewmodelからテキストボックスへの)他の方向へのバインディングは正常に動作します。

バインドを使用せずにコードからTextBox.Textを編集する方法はありますか? または、私のプロセスのどこかにエラーがありますか?

+3

モデルでMVVMを使用しているときにテキストボックスの変更を自動的に反映するこの値を更新するのが理想的です。 – Deepesh

+1

バインドに 'UpdateSourceTrigger = PropertyChanged'を追加しようとしました –

+0

これは今までの古い質問ですが、人々がここで無視しているように見えることは、コントロールのプロパティが別のコントロールにバインドされている場合ですそれらはすべて親チェックボックスでチェックまたはチェックされません)。ここでは、VMには何も役立つものはありません。 –

答えて

8
var box = sender as TextBox; 
// Change your box text.. 

box.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

これでバインドを強制的に更新する必要があります。

+0

UpdateTarget()を使用すると、実際には更新されず、テキストボックスでも古い値が保持されます。 –

+0

いくつかの答えはまだいくつかの考えを必要とする..あなたは私が間にテキストを調整していないことを除いて、私がした同じコードを使用して見て..私はこれが正しい答えであると考えていますか? – KyorCode

+0

私は助けてくれた唯一の人なので、あなたに+1しました。 –

3

Textプロパティを変更しないでください。バインド先を変更します。あなたは全くのTextBoxの値を変更する必要が `tの

private static void SetText(TextBox textBox, string text) 
    { 
     textBox.Clear(); 
     textBox.AppendText(text); 
     textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
    } 
+0

なぜテキストボックスにviewmodel自体への参照が必要なのですか?私は特定の型へのキャストをしたくない、なぜ私は双方向バインディングを使用したのですか? –

+0

テキストボックスを参照しないでください。テキストを更新する必要があります。 –

+0

真剣に "TextBoxInput(オブジェクト送信者、KeyEventArgs e)"イベントハンドラ... –

1

これはトリックをしました!コードでは、関連する値(ShortCutText)のみを変更する必要があります。また、IsReadOnly = "True" TextBoxのプロパティを設定することができます。

<TextBox Text="{Binding Path=ShortCutText,Mode=OneWay}" 
     KeyDown="TextBox_KeyDown" IsReadOnly="True"/> 

あなたは、MSDNで説明したようにがあなたのクラスでインターフェイスをINotifyPropertyChangedの実現すべきである:(あなたののTextBoxがバインドされている)あなたのShortcutTextの財産の

http://msdn.microsoft.com/library/system.componentmodel.inotifypropertychanged.aspx

修正セッターを:

class MyClass:INotifyPropertyChanged 
{ 
    string shortCutText="Alt+A"; 
    public string ShortCutText 
    { 
     get { return shortCutText; } 
     set 
      { 
        shortCutText=value; 
        NotifyPropertyChanged("ShortCutText"); 
      } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    void NotifyPropertyChanged(string props) 
    { 
     if(PropertyChanged != null) 
      PropertyChanged(this , new PropertyChangedEventArgs(prop)); 
    } 

} 

WPFは自動的にPropertyChangedイベントを購読します。 さて、このように、例えば、テキストボックスのKeyDownイベントイベントを使用します。私は似たようなケースを持って

private void TextBox_KeyDown(object sender , KeyEventArgs e) 
{ 
    ShortCutText = 
     (e.KeyboardDevice.IsKeyDown(Key.LeftCtrl)? "Ctrl+ " : "") 
     + e.Key.ToString(); 
} 
0

1

このテキストボックスをクリアすると、バインディングが失われます。

私が着ていた:textbox1.Text = String.empty

を私はこれを変更:textbox1.Clear()

そして、これはあなたがMVVMを使用している場合は、コードからのTextBoxのTextプロパティを変更しないでください私の解決策

0

ためのポイントですビュー・モデルの値を変更すると、パターンはそのビューを同期させることになります。

関連する問題