2012-09-05 77 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

不要更改文本屬性 - 更改您綁定的內容。

+0

爲什麼文本框應該引用viewmodel本身?我不想對任何類型的對象進行轉換,這就是爲什麼我使用了雙向綁定。 –

+0

它不應該,不要指向文本框。必須更新文本,它不應該知道文本框。 –

+0

嚴重嗎?它是一個「TextBoxInput(object sender,KeyEventArgs e)」事件處理程序... –

1

這奏效了:

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

客人不願意需要在所有的修改文本框的值!在代碼中,您只需要修改相關的值(ShortCutText)也可以設置IsReadOnly =「True」TextBox的屬性。

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

你應該認識INotifyPropertyChanged的在你的類接口在MSDN描述:

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

ShortcutText下財產

修改制定者(到您的文本框必將) :

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(); 
} 
1

我也有類似的情況。

當我清除文本框,這失去了綁定。

我穿着:textbox1.Text = String.empty

我改變了這一點:textbox1.Clear()

而這點,我的解決方案

0

如果你使用MVVM,你不應該改變從代碼TextBox的Text屬性,更改視圖模型中的值,並且模式將完成其同步視圖的工作。

相關問題