用于绑定方式的不同UpdateSourceTrigger

时间:2012-10-04 07:29:25

标签: c# wpf binding updatesourcetrigger

我不知道我是如何实现一种特殊行为的。 我有一个包含两列的数据网格视图。 一列显示格式化价格(“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。

希望你们中有些人对我有建议: - )

安德烈

1 个答案:

答案 0 :(得分:0)

当用户从TextBox中移除焦点时,您始终可以使用UpdateSourceTrigger=LostFocus来触发数字的格式设置。对于验证,我建议使用内置于用户控件中的Validation in Windows Presentation Format

编辑: 将OnSelect事件添加到TabItemset Focus(从TextBlock中移除焦点),但必须在TabItem上启用IsEnabled和IsFocusable。