2016-04-28 4 views
2

データグリッドのセル/列にバインドされている通貨値を書式設定したいとします。XAMLでの文化認識ATMの書式設定

次のように関連するXAMLである:

<telerik:RadGridView Grid.Row="0" Grid.ColumnSpan="2" x:Name="dataGrid" 
    AutoGenerateColumns="False" HorizontalAlignment="Stretch" 
    VerticalAlignment="Top" Margin="0,25,0,0" IsSearchingDeferred="True" 
    IsReadOnly="True" IsLocalizationLanguageRespected="False"> 
    <telerik:RadGridView.Columns> 
     <telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat=C}" 
      Header="{x:Static properties:Resources.AddressLine3}"/> 
    </telerik:RadGridView.Columns> 
</telerik:RadGridView> 

これは現在カラム(値は数値リテラルとしてデータベースから来ている)に結合されている値である。

12345678.90 

カルチャーをen-USに設定したときに出力される値です。

12345678.90 //notice the decimal point 

T彼は文化がnl-NL

12345678,90 //notice the comma 

に設定されているときに出力されますが、文化はある程度尊重されていることがわかります値です。しかし、出力は私が期待するものではありません。

en-USの培養については、出力を$12,345,678.90としたいと思います。 nl-NLカルチャーについては、出力を€ 12.345.680,00としたいと思います。なぜフォーマット通貨記号と番号を示している

public MainWindow() 
{ 
    //I am toggling between the following cultures 
    CultureInfo ci = new CultureInfo("nl-NL"); 
    //CultureInfo ci = new CultureInfo("ja-JP"); 
    //CultureInfo ci = new CultureInfo("en-US"); 

    //I am forcing the UI to use the culture I specify 
    Thread.CurrentThread.CurrentCulture = ci; 
    Thread.CurrentThread.CurrentUICulture = ci; 
    this.Language = XmlLanguage.GetLanguage(ci.Name); 
    Properties.Resources.Culture = ci; 

    //these are used to test that to string formatting works as expected 
    //when using the debugger 
    float price = 12345678.90F; 
    string currencyToDisplay = price.ToString("C"); 

    InitializeComponent(); 
} 

質問

:後ろに手動で次のコードを使用して(テスト目的のために)培養物を設定したの私のXAMLコードで

形式を通貨として指定したにもかかわらず、区切り記号

手作業では、同じ番号をコードの後ろに書式設定すると私の望む結果が得られますが、XAMLでこれを行いたいと思います。私は を試してみました何

私は無駄に次の回避策を試してみました:

<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat=C}" Header="{x:Static properties:Resources.AddressLine3}"/> 
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat={}{0:C}}" Header="{x:Static properties:Resources.AddressLine3}"/> 
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat=\{0:C\}}" Header="{x:Static properties:Resources.AddressLine3}"/> 
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat='C'}" Header="{x:Static properties:Resources.AddressLine3}"/> 
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat=c}" Header="{x:Static properties:Resources.AddressLine3}"/> 
<telerik:GridViewDataColumn DataMemberBinding="{Binding VALUATION}" DataFormatString="{}{0:C}" Header="{x:Static properties:Resources.AddressLine3}"/> 

は、私が行方不明です何がありますか?

+0

あなたのコードは正常に動作し、通貨記号を表示し、問題がどこかにあるはずです。また、あなたのような簡単なチェックを行うことによってに渡されるデータの種類を判別することができますコンバータを使用して
。バインドするクラス(VALUATIONプロパティを含むクラス)の定義を表示できますか? – Evk

+0

バインドにクラス定義が使用されていません。バインドはSQLクエリによって返されたデータテーブルに対して行われています。データグリッドの名前は 'dataGrid'で、データは' dataGrid.ItemsSource = ToDataTable(results).DefaultView; 'のようにバインドされています。データは問題なくバインドされます。 –

+0

野生の推測では、あなたの数字を既にstringに変換しているかもしれません。_before_バインディングが行われるので、VALUATIONはすでにデータテーブルのString型(decimal \ floatではなく)です。 – Evk

答えて

1

私たちはコメントで話しました。
通貨記号が表示されない理由としては、使用していたUserControlが正しいカルチャを使用していないことが考えられます。 DynamicResourceを使用してButtonのスタイルを設定した場合は、xamlにResourceDictionaryを含めずに同様の動作を検出しました。つまり、ドットがコンマになっても通貨記号がない場合のように、スタイルが部分的に適用されたということです。

namespace WpfApplication1.Converters 
{ 
    public class DebugConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      //manipulate your data here 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 
:あなたはこのようになりますクラスを作成する必要があり、コンバータのための今すぐ

<UserControl x:Class="WpfApplication1.Views.CultureExplicitUC" 
      xml:lang="en-GB"<!--This is what you want in your UC--> 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:WpfApplication1.Views" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 

    </Grid> 
</UserControl> 

:希望文化を使用するようにUserCpntrolを強制的に
一つの方法は、あなたのUserControl XAMLファイルにこのスニペットを含めることです

コンバータにはcultureInfoがパラメータとして設定されていますので、必要に応じて開発状況に応じて手動で変更することができます。
if(value is int)