2

(最初に、わかりやすいようにサンプルを単純化しました。)

値をインチで表​​示する編集可能なComboBox が必要です。元の (ソース) 値はピクセル(DIP) 単位の値です。これは、アプリケーションが内部的に動作する単位であるためです。ユーザーには、値がピクセルではなく、インチ (UI の測定単位) で表示されます。コンバーターを使用して、ピクセルからインチに、またはその逆に変換する必要があると判断しました。

ComboBox 項目も "{0} in" でフォーマットする必要があります。

このように表示されるはずです

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

ただし、内部的には Pixels で動作するはずです。編集可能であること。作品部分です。私はこれを達成することができませんでした。

私はこれまでのところこれを持っています:

  <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 に答える