我不知道我是如何实现一种特殊行为的。 我有一个包含两列的数据网格视图。 一列显示格式化价格(“00.00”)。 更新绑定(属性设置)后,价格将自动保存。 如果我使用UpdateSourceTrigger = PropertyChanged,价格总是正确的。此触发器的缺点是,如果用户选择文本框中的所有文本并仅键入“1”,则价格将格式化为“01.00”。我不希望价格自动格式化。只有当焦点移动到另一个对象时才会出现格式化。
理论上我需要设置两个不同的UpdateSourceTrigger。一个用于更新后端(用户在文本框中键入内容)。一个用于更新目标(焦点移动到另一个对象)。另外,如果新值无效,我需要立即显示。
<DataGrid>
<DataGrid.Columns>
<!-- one other column -->
<DataGridTemplateColumn Header="Price"/>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<!-- this textbox should update the source if user types something -->
<!-- the textbox itself should be updated after lost focus -->
<TextBox Text="{Binding Price, UpdateSourceTriger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn/>
</DataGrid.Column>
</DataGrid>
编辑: 我将举一个小例子:如果我将绑定的Price属性设置为“1”,它将自动格式化为“01.00”。使用UpdateSourceTrigger = PropertyChanged,TextBox显示“01.00”。只要TextBox被聚焦,我希望TextBox显示“1”。当然,我会使用UpdateSourceTrigger = LostFocus获得该行为。这里的问题是,DataGrid包含在TabControll中,并且两个控件都不能很好地协同工作。如果在焦点仍在TextBox上时选择其他选项卡,则TextBox不会抛出任何LostFocus。
希望你们中有些人对我有建议: - )
安德烈
答案 0 :(得分:0)
当用户从TextBox中移除焦点时,您始终可以使用UpdateSourceTrigger=LostFocus
来触发数字的格式设置。对于验证,我建议使用内置于用户控件中的Validation in Windows Presentation Format。
编辑:
将OnSelect事件添加到TabItem
到set Focus(从TextBlock中移除焦点),但必须在TabItem上启用IsEnabled和IsFocusable。