9

WPF アプリケーションで、キーボード ショートカットをカスタマイズするための設定ウィンドウを作成しています。

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

テキストボックスはこのように宣言されています

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

イベントハンドラーでは、両方を使用してみました

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

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

どちらの場合も、viewmodel へのバインディングは機能せず、viewmodel にはまだ古いデータが含まれており、更新されません。他の方向 (viewmodel からテキスト ボックス) へのバインドは正常に機能します。

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

4

8 に答える 8

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

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

これにより、バインディングが強制的に更新されます。

于 2012-09-05T12:01:57.853 に答える
3

Text プロパティを変更しないでください。バインド先を変更してください。

于 2012-09-05T12:05:06.010 に答える
2

新しい値を設定してバインディングが破棄された場合 (これは奇妙です。双方向バインディングの場合、バインディングはそのままにしておく必要があります)、 ((TextBox)sender).SetCurrentValue(TextBox.TextProperty, newValue) を使用してバインディングをそのままにします。

于 2020-02-27T13:39:08.880 に答える
1

TextBoxの値を変更する必要はまったくありません!コードでは、関連する値( ShortCutText)を変更するだけで済みます。また、TextBoxのIsReadOnly =" True "プロパティを設定することもできます。

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

MSDNで説明されているように、クラスでINotifyPropertyChangedインターフェイスを実現する必要があります。

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

ShortCutTextプロパティ(TextBoxがバインドされている)のセッターを変更します。

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イベントを自動的にサブスクライブします。次に、TextBoxのKeyDownイベントを次のように使用します。

private void TextBox_KeyDown( object sender , KeyEventArgs e )
{
    ShortCutText = 
        ( e.KeyboardDevice.IsKeyDown( Key.LeftCtrl )? "Ctrl+ " : "" )
        + e.Key.ToString( );
}
于 2012-09-05T18:50:23.220 に答える
1

これはトリックをしました:

private static void SetText(TextBox textBox, string text)
    {
        textBox.Clear();
        textBox.AppendText(text);
        textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }
于 2012-09-05T12:06:38.360 に答える
1

私も似たようなケースがあります。

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

着用した:textbox1.Text = String.empty

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

そして、これが私の解決策のポイントです

于 2015-05-24T23:02:25.490 に答える
0

MVVM を使用している場合は、 TextBox の Text プロパティを code から変更しないでください。ビュー モデルの値を変更すると、パターンはビューを同期するジョブを実行します。

于 2015-05-25T10:06:07.540 に答える