【问题标题】:WPF: Editable ComboBox and StringFormatWPF:可编辑的组合框和字符串格式
【发布时间】:2013-05-16 10:35:58
【问题描述】:

(首先,我简化了示例以便您理解。)

我想要一个以英寸为单位显示值的可编辑组合框。 原始(源)值是以像素为单位的值 (DIP),因为这是应用程序内部工作的单位。用户不应该看到以像素为单位的值,而是以英寸(UI 的测量单位)为单位的值。我决定必须使用转换器将像素转换为英寸,反之亦然。

ComboBox 项目也应使用“{0} in”进行格式化。

应该是这样的

[ 4 in  |v]
  [ 1 in  ]
  [ 2 in  ]
  [ 3 in  ]
  [ 4 in  ]

但是,请记住,在内部它应该在像素中工作!并且是可编辑的。这是作品部分。我完全无法做到这一点。

到目前为止我有这个:

  <ComboBox IsEditable="True"
            ItemStringFormat="'{}{0} in}'"                  
            Text="{Binding RelativeSource={RelativeSource Self}, Path=SelectedValue, Mode=TwoWay, Converter={StaticResource MyPixelToInchesConverter}, StringFormat='{}{0} in}'}">
            <system:Double>1</system:Double>
            <system:Double>2</system:Double>
            <system:Double>3</system:Double>
  </ComboBox>

问题?当您选择一个项目时,它没有被格式化。而且当你在 ComboBox 的可编辑区域写一个数字时,它也没有被格式化。

那么,即使用户输入了一个不存在的值,ComboBox 格式化项目的最佳方式是什么?

谢谢!

【问题讨论】:

    标签: combobox units-of-measurement string-formatting


    【解决方案1】:

    可能有点晚了,但我发现将Text 属性设置为使用绑定可以工作,但有点麻烦。就我而言,我使用的是货币值,但应该适用相同的原则

    Text = {Binding Path=Indemnity, StringFormat=C0}
    

    但是,输入不在列表中的文本值仍然会出现 StringFormat 未应用的问题(由于某些奇怪的原因,只有设计此功能的 MS 人员才知道)。

    为了解决这个问题,我添加了一个 LostFocus 处理程序,它只是写入一个不正确的值,然后再次写入正确的值 - 在该阶段应用 StringFormat

    private void IndemnityCombo_LostFocus(object sender, RoutedEventArgs e)
    {
        var vm = this.DataContext as RatesViewModel;    // A view model class
        if (vm != null) {
            decimal indemnity = vm.Indemnity;
            vm.Indemnity = indemnity + 1M;
            vm.Indemnity = indemnity;
        }
    }
    

    它并不优雅,但它为我完成了这项工作。希望对其他用户有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-03
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      相关资源
      最近更新 更多