如何动态更改 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();
}
我有 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();
}