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

Posted

技术标签:

【中文标题】如何在 WPF Datagrid 中动态更改字符串货币格式【英文标题】:How to dynamically change string currency format in WPF Datagrid 【发布时间】:2021-08-18 18:06:02 【问题描述】:

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

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

<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?

【问题讨论】:

绑定只能由 DependecyObject 中声明的 DependecyProperty 指定。但是 Binding 本身是一个 MarkupExtension。而其中的属性(包括ConverterCulture)都是普通的CLR属性。如果您需要在一个或两个属性的绑定中实现这一点,那么最简单的方法是使用 MultiBinding 和一个 multiconverter。 【参考方案1】:

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

设置DataGridLanguage属性:

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

这是一个可以绑定的依赖属性。

【讨论】:

我只想更改一列的格式,而不是所有 DataGrid。【参考方案2】:

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

<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/>

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

【讨论】:

据我所知,在这种情况下,我应该在 xaml 中定义所有可能的货币。但我想在运行时定义货币而不是静态的。 只需创建一个货币或文化类型的变量,然后绑定到它【参考方案3】:

终于找到了解决办法。不理想,但似乎有效。 CurrentContext 是我用来存储变量的静态类。 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();

【讨论】:

以上是关于如何在 WPF Datagrid 中动态更改字符串货币格式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WPF DataGrid 中动态生成列?

WPF DataGrid表头合并且动态添加列

WPF DataGrid 如何动态设置单行高度

WPF MvvM DataGrid 动态列

如何获取 WPF DataGrid 以将更改保存回数据库?

如何使用 WPF Toolkit Datagrid 更改单元格的背景颜色