绑定值和货币到DataGridTextColumn

时间:2018-02-12 08:02:35

标签: c# wpf xaml binding

我想绑定文本列的货币,如果我输入像“de”这样的值,它正在工作,我可以看到欧元。但是如果我试图绑定它就会发送错误。

Ofc我可以将货币绑定到整个View,但我总是要显示2种不同的货币。

有些代码无效:

Binding="{Binding Income,StringFormat=C,ConverterCulture={Binding CultureFormat}}" />

如果我喜欢这样,它就能正常工作:

<DataGridTextColumn Header="Saldo" Binding="{Binding Balance,StringFormat=C,ConverterCulture=de}" />

我发现这是使用多重绑定的一些解决方案,但我不知道在这个例子中是怎么做的。

2 个答案:

答案 0 :(得分:1)

以下是使用多重绑定和转换器的方法:

public class CultureConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if(values[0] != DependencyProperty.UnsetValue && values[1] != DependencyProperty.UnsetValue)
        {
            decimal balance = System.Convert.ToDecimal(values[0]);
            string c = values[1] as string;

            return balance.ToString("C", CultureInfo.GetCultureInfo(c));
        }

        return Binding.DoNothing;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

<强> XAML:

<DataGrid ...>
    <DataGrid.Resources>
        <local:CultureConverter x:Key="conv" />
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Saldo">
            <DataGridTextColumn.Binding>
                <MultiBinding Converter="{StaticResource conv}">
                    <Binding Path="Income" />
                    <Binding Path="CultureFormat" />
                </MultiBinding>
            </DataGridTextColumn.Binding>
        </DataGridTextColumn>
       ...
    </DataGrid.Columns>
</DataGrid>

该示例假定CultureFormat属性返回一个字符串。如果它返回CultureInfo,您只需将values[1]投射到此类型而不是string

答案 1 :(得分:0)

Binding不是依赖对象,其属性不是依赖对象。要将绑定应用于Binding.ConverterCulture,源应该是依赖属性,我想CultureFormat不是。

如果您需要变量文化信息,可以使用特定属性在ViewModel中格式化数据,例如

public string BalanceString
{
    get { return String.Format(CultureFormat, "C", Balance); }
}

然后使用这个新属性进行绑定:

<DataGridTextColumn Header="Saldo" Binding="{Binding BalanceString, Mode=OneWay}" />