[英]Manipulate order of WPF TextBox LostFocus event and binding
我有一個代表數據編輯器的WPF Window
。 Window
的DataContext
是一個可觀察對象(實現了INotifyPropertyChanged
)。
每個可觀察對象的屬性都綁定到Window
的適當小部件( TextBox
用於數字類型, CheckBox
用於bool
等)。
我不想讓“確定”和“取消”按鈕來保持更改的屬性; 我希望當窗口小部件失去焦點時,底層數據將持久保存到可觀察對象。
為此,我已經處理了小部件的PreviewLostKeyboardFocus
和LostFocus
事件。 我的undo框架需要一個代表當前狀態的observable對象的副本,以及一個新狀態的副本。 PreviewLostKeyboardFocus
事件生成對象的副本, LostFocus
事件實際執行保存到數據庫。
但我的問題是這樣的:綁定場上實際上並不更新基本可觀察到的物體后 ,直到LostFocus
運行事件。 實際效果是將TextBox
中的TextBox
從“A”更改為“B”將使字段中的數據保持為“A”。 將其從“A”更改為“B”到“C”將持續“B”。
我在事件處理程序和底層對象的setter中放置了斷點。 果然, PreviewLostKeyboardFocus
首先運行,然后運行LostFocus
,最后運行可觀察對象的setter。
我想讓它盡可能通用,所以雖然我可以告訴可觀察對象使用KeyboardFocusChangedEventArgs
更新自己的屬性,但我需要為每個字段分別設置事件處理程序,並且可能會有很多。
有沒有辦法讓Binding
在PreviewLostKeyboardFocus
和LostFocus
事件之間運行?
XAML:
<TextBox Text="{Binding ObjectProperty, StringFormat='{}{0:F5}'}" LostFocus="PersistentTextBox_LostFocus" PreviewLostKeyboardFocus="PersistentTextBox_PreviewLostKeyboardFocus" />
代碼背后的事件處理程序:
private void PersistentTextBox_LostFocus(object sender, RoutedEventArgs e) {
this.ObservableObject.PersistChanges(this.tempObservableObject);
}
private void PersistentTextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
this.tempObservableObject = this.ObservableObject;
}
ObservableObject
類(setter):
public class ObservableObject : INotifyPropertyChanged {
...
public Single ObjectProperty {
get {
return this._objectProperty;
}
set {
this._objectProperty = value;
RaisePropertyChanged("ObjectProperty");
}
}
}
謝謝!
如果我正確理解您的問題,這可能是由於默認情況下TextBox
在焦點丟失時更新Source
。
解決此問題的一種方法是將TextBox
UpdateSourceTrigger
設置為PropertyChanged
<TextBox Text="{Binding ObjectProperty, UpdateSourceTrigger=PropertyChanged, StringFormat='{}{0:F5}'}"
這將允許在TextBox
進行更改后立即更新基礎可觀察對象,然后您可以在窗口小部件丟失焦點事件中保留更改
或者您可以將UpdateSourceTrigger
設置為Explicit
並更新LostFocus處理程序中的Source。
<TextBox Text="{Binding ObjectProperty, UpdateSourceTrigger=Explicit, StringFormat='{}{0:F5}'}"
private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
(sender as TextBox).GetBindingExpression(TextBox.TextProperty).UpdateSource();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.