如何在 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?
设置DataGrid
的Language
属性:
<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 中动态更改字符串货币格式的主要内容,如果未能解决你的问题,请参考以下文章