【问题标题】:Change Binding Format with Focus使用焦点更改绑定格式
【发布时间】:2011-09-07 12:54:41
【问题描述】:

使用 MVVM 的 WPF 应用程序。我有一个TextBox,其Text 属性绑定到视图模型的decimal 属性。此属性表示货币值。我希望TextBox 以货币格式显示数据。为此,我在Binding 中将StringFormat 设置为“c”。这按预期工作。

问题是,如果SourceUpdateTriggerPropertyChanged,当用户开始输入时,在输入第一个字符后应用格式,然后插入符号位于刚刚输入的字符之前。这意味着下一个字符将在第一个字符之前而不是之后输入。如果SourceUpdateTriggerLostFocus,则用户必须在启用OK 按钮之前将焦点转移到另一个控件,这发生在验证货币字段之后。

我希望做的是处理 GotFocusLostFocus 事件,获取对 Binding 的引用并更改其 StringFormat 属性。关于 MVVM,我对此没有任何问题,因为它纯粹是 UI 问题。问题是抛出了异常,被告知Binding使用后无法更改。

我考虑了其他各种选项,包括自定义转换器。但这不起作用,因为我不知道如何使用 ConverterParameter 将控件的 IsFocused 属性公开给转换器。

有人有什么想法吗?

【问题讨论】:

  • UpdateSourceTrigger 留在LostFocus 并处理TextChanged 以在绑定上调用ValidateWithoutUpdate 怎么样?

标签: wpf validation data-binding textbox binding


【解决方案1】:

您可以在数据模板中使用数据触发器来动态更改文本框的绑定。

 <DataTemplate x:Key="DataTemplate1">
      <TextBox x:Name="TheTextBox"
               Text="{Binding Path=ThePropertyPath, StringFormat={}{0:p0}, UpdateSourceTrigger=PropertyChanged}" />
    <DataTemplate.Triggers>
       <!--  Set the TextBox.Text Binding but this time leave the StringFormat off -->
       <DataTrigger Binding="{Binding Path=IsKeyboardFocusWithin, ElementName=TheTextBox}" Value="True">
            <Setter TargetName="TheTextBox" Property="Text" Value="{Binding Path=ThePropertyPath, UpdateSourceTrigger=PropertyChanged}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=IsFocused, ElementName=TheTextBox}" Value="True">
            <Setter TargetName="TheTextBox" Property="Text" Value="{Binding Path=ThePropertyPath, UpdateSourceTrigger=PropertyChanged}" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多