我有一个WPF
Observable对象的每个属性都绑定到
我不想有“OK”和“Cancel”按钮来保存更改的属性;我希望在小部件失去焦点时将底层数据保存到Observable对象中。
为此,我处理了小部件的
但我的问题是:字段上的绑定直到
我在事件处理程序和基础对象的setter中设置了断点。果然,
我想尽可能地使其通用化,因此虽然我可以告诉Observable对象使用
有没有办法让绑定在
窗口
作为数据编辑器。 Window
的DataContext
是一个Observable对象(实现了INotifyPropertyChanged
)。Observable对象的每个属性都绑定到
Window
中适当的小部件上(数字类型用TextBox
,布尔值用CheckBox
等)。我不想有“OK”和“Cancel”按钮来保存更改的属性;我希望在小部件失去焦点时将底层数据保存到Observable对象中。
为此,我处理了小部件的
PreviewLostKeyboardFocus
和LostFocus
事件。我的撤销框架需要Observable对象的当前状态副本和新状态副本。 PreviewLostKeyboardFocus
事件会创建对象的副本,而LostFocus
事件则实际执行保存到数据库的操作。但我的问题是:字段上的绑定直到
LostFocus
事件运行之后才实际更新基础Observable对象。这样做所产生的影响是,从“A”更改文本框的文本到“B”会将该字段中的数据保存为“A”。连续更改从“A”到“B”再到“C”会将“B”保存下来。我在事件处理程序和基础对象的setter中设置了断点。果然,
PreviewLostKeyboardFocus
先运行,然后是LostFocus
,最后是Observable对象的setter。我想尽可能地使其通用化,因此虽然我可以告诉Observable对象使用
KeyboardFocusChangedEventArgs
更新自己的属性,但我需要为每个字段单独设置事件处理程序,而且可能会有很多这样的字段。有没有办法让绑定在
PreviewLostKeyboardFocus
和LostFocus
事件之间运行?<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
class (setter):
public class ObservableObject : INotifyPropertyChanged {
...
public Single ObjectProperty {
get {
return this._objectProperty;
}
set {
this._objectProperty = value;
RaisePropertyChanged("ObjectProperty");
}
}
}
谢谢!
UpdateSourceTrigger=PropertyChanged
对我的目的已经足够好了。我不喜欢它在每次按键时都会持续更新基础对象,但实际上我想不到任何理由来避免这种情况。这是用户思考的时间,因此性能真的不应该成为问题。谢谢! - James Cronen