WPF:可编辑的ComboBox和StringFormat

时间:2013-05-21 15:27:31

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

(首先,我简化了样本供您理解。)

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

ComboBox项目也应使用" {0}格式化在"中。

应该看起来像这样

[ 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格式化项目的最佳方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

可能有点迟了,但我发现设置Text属性以使用绑定可以起作用,有点像kludge。在我的情况下,我正在使用货币值,但应适用相同的原则

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;
    }
}

它不优雅,但它对我有用。希望它对其他用户有用。