簡體   English   中英

操縱WPF TextBox LostFocus事件和綁定的順序

[英]Manipulate order of WPF TextBox LostFocus event and binding

我有一個代表數據編輯器的WPF Window WindowDataContext是一個可觀察對象(實現了INotifyPropertyChanged )。

每個可觀察對象的屬性都綁定到Window的適當小部件( TextBox用於數字類型, CheckBox用於bool等)。

我不想讓“確定”和“取消”按鈕來保持更改的屬性; 我希望當窗口小部件失去焦點時,底層數據將持久保存到可觀察對象。

為此,我已經處理了小部件的PreviewLostKeyboardFocusLostFocus事件。 我的undo框架需要一個代表當前狀態的observable對象的副本,以及一個新狀態的副本。 PreviewLostKeyboardFocus事件生成對象的副本, LostFocus事件實際執行保存到數據庫。

但我的問題是這樣的:綁定場上實際上並不更新基本可觀察到的物體 ,直到LostFocus運行事件。 實際效果是將TextBox中的TextBox從“A”更改為“B”將使字段中的數據保持為“A”。 將其從“A”更改為“B”到“C”將持續“B”。

我在事件處理程序和底層對象的setter中放置了斷點。 果然, PreviewLostKeyboardFocus首先運行,然后運行LostFocus ,最后運行可觀察對象的setter。

我想讓它盡可能通用,所以雖然我可以告訴可觀察對象使用KeyboardFocusChangedEventArgs更新自己的屬性,但我需要為每個字段分別設置事件處理程序,並且可能會有很多。

有沒有辦法讓BindingPreviewLostKeyboardFocusLostFocus事件之間運行?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM