2

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

我想要一个以英寸为单位显示值的可编辑组合框。原始(源)值是以像素(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 格式化项目的最佳方式是什么?

谢谢!

4

1 回答 1

0

可能有点晚了,但我发现将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;
    }
}

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

于 2013-10-07T15:29:12.633 回答