【问题标题】:Saving in a WPF data entry form保存在 WPF 数据输入表单中
【发布时间】:2012-01-12 02:27:17
【问题描述】:
我有一个 WPF MVVM 应用程序,其中包含一个带有多个文本框的数据输入表单。我注意到,当用户在文本框中并进行更改时,Context 对象不知道进行了更改,直到用户从该文本框中跳出。一旦用户跳出文本框,一切正常。但我想知道在用户不必关闭文本框的情况下进行了更改。
这可能吗?
我的表单的工作方式是保存和取消按钮绑定到 ICommands。这些命令有一个“CanSave”和“CanCancel”方法,用于检查 EntityState 是否发生了变化,但允许按钮启用。这很好用,但用户必须关闭文本框才能正常工作。
如何在不让用户关闭更改的文本框的情况下完成这项工作?
【问题讨论】:
标签:
wpf
entity-framework
mvvm
【解决方案1】:
将 TextBox 的绑定方向(模式)设置为 TwoWay 而不是默认值,并将 UpdateSourceTrigger 设置为 PropertyChanged 而不是默认值...像这样:
<TextBox x:Name="txtPersonLastname" Text="{Binding Person.LastName, Mode=TwoWay, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" />
(我在这段摘录中有一些额外的属性可供验证。)
关键区别在于 PropertyChanged 将更新您在 ViewModel 中的支持属性。当用户在 TextBox 中输入任何内容时,PropertyChanged 事件将触发,进而触发您的 CanSave、Save 例程。
在 Blend 中,它应该如下所示:
【解决方案2】:
您必须更改更新源触发器属性以反映 ViewModel 中的更改
举例
<TextBox Text={Binding Path=MyProperty,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}></TextBox>
不要忘记My Property 应该触发从 ViweModel 更改的属性