(首先,我简化了样本供您理解。)
我想要一个可编辑的组合框,以英寸显示值。 原始(源)值是一个以像素为单位的值(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格式化项目的最佳方法是什么?
谢谢!
答案 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;
}
}
它不优雅,但它对我有用。希望它对其他用户有用。