2013-05-21 107 views
2

(首先,我簡化了樣品供您瞭解。)WPF:編輯ComboBox和的StringFormat

我想編輯組合框,顯示以英寸爲單位的值。 原始(源)值是像素爲(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格式化項目的最佳方式是什麼?

謝謝!

回答

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

這不是優雅,但它爲我做這份工作。希望它對其他用戶有用。