如何动态更改 WPF Datagrid 中的字符串货币格式

How to dynamically change string currency format in WPF Datagrid

我有 WPF 应用程序和包含一些价格的 DataGrid。 我想动态更改货币和列格式也必须调整。

我找到的唯一方法是通过这种方式设置格式:

<DataGridTextColumn Header="Price" Width="95" Binding="{Binding Path=Price, StringFormat=C, ConverterCulture='en-US'}" />

但是这个绑定是静态的。当我尝试将 ConverterCulture 绑定到代码中的值时,它会抛出绑定错误。

<DataGridTextColumn Header="Price" Width="95" Binding="{Binding Path=Price, StringFormat=C, ConverterCulture="{Binding Source=CurrencyCulture}" />

有什么方法可以动态更改 Datagrid 列格式的 ConverterCulture?

我没有对其进行测试,所以我不能确定它是否有效,但您可以使用样式和数据触发器尝试类似的方法。在此示例中,您需要一个依赖项 属性“货币”,您将其设置为“美元”以触发更改,但是您可以根据需要调整触发器:

<DataGridTextColumn Header="Price" Width="95" Binding="{Binding Path=Price, StringFormat=C, ConverterCulture="{Binding Source=CurrencyCulture}">
    <DataGridTextColumn.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="Binding" Value="{Binding Path=Price, StringFormat=C, ConverterCulture="{Binding Source=CurrencyCulture}"
            <Style.Triggers>
                <DataTrigger Binding="Currency" Value="USD">
                    <Setter Property="Binding" Value="{Binding Path=Price, StringFormat=C, ConverterCulture='en-US'}"
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGridTextColumn.CellStyle>
<DataGridTextColumn/>

希望这能解决您的问题或引导您朝着成功的方向发展

Is there any way to dynamycally change ConverterCulture in Datagrid column format?

设置Language属性的DataGrid:

<DataGrid Language="fr-FR" ...>

这是您可以绑定到的依赖项 属性。

终于找到解决办法了。不理想但似乎有效。 CurrentContext 是我用来存储变量的静态 class。 SelectedCurrency.CurrencyCode 是 3 个字符的货币代码,例如 USD 或 EUR。 当我在 Combobox 中更改货币时,列中的字符串格式也会随着所需的货币符号而变化。

CultureConverter.cs

public class CultureConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values[0] == null) return string.Empty;


            return String.Format(CurrentContext.CultureInfo, "{0:C}", values[0]);
        }

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

Form.xaml

<Window.Resources>
        <providers:CultureConverter x:Key="CultureConverter" />
    </Window.Resources>

DataGrid Name="Datagrid" ItemsSource="{Binding Items, Mode=TwoWay}" AutoGenerateColumns="False">
  <DataGrid.Columns>
...
    <DataGridTemplateColumn>
      <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
           <TextBlock>
             <TextBlock.Text>
               <MultiBinding Converter="{StaticResource CultureConverter}">
                 <Binding Path="InitialCost" />
               </MultiBinding>
             </TextBlock.Text>
           </TextBlock>
         </DataTemplate>
       </DataGridTemplateColumn.CellTemplate>
   </DataGridTemplateColumn>
...
  </DataGrid.Columns>
</DataGrid>
private void CB_Currency_SelectionChanged(object sender, SelectionChangedEventArgs e)
{

    CurrentContext.CultureInfo = 
    CultureInfo.GetCultures(CultureTypes.SpecificCultures)
                          .Where(x => new RegionInfo(x.LCID)
                          .ISOCurrencySymbol == SelectedCurrency.CurrencyCode)
                          .First();
}