C# 将值和货币绑定到DataGridTextColumn
我想为文本列绑定货币,如果我像de一样键入值,它将起作用,我可以看到欧元。但如果我尝试绑定它,它将发送一个错误 Ofc我可以将货币绑定到整个视图,但我始终有两种不同的货币要显示 有一些代码不起作用:C# 将值和货币绑定到DataGridTextColumn,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,我想为文本列绑定货币,如果我像de一样键入值,它将起作用,我可以看到欧元。但如果我尝试绑定它,它将发送一个错误 Ofc我可以将货币绑定到整个视图,但我始终有两种不同的货币要显示 有一些代码不起作用: Binding="{Binding Income,StringFormat=C,ConverterCulture={Binding CultureFormat}}" /> 如果我喜欢这个,它工作正常: <DataGridTextColumn Header="Saldo" Binding
Binding="{Binding Income,StringFormat=C,ConverterCulture={Binding CultureFormat}}" />
如果我喜欢这个,它工作正常:
<DataGridTextColumn Header="Saldo" Binding="{Binding Balance,StringFormat=C,ConverterCulture=de}" />
我发现这是一种使用多重绑定的解决方案,但我不知道如何在本例中使用。绑定不是依赖对象,其属性也不是依赖对象。要将绑定应用于binding.ConverterCulture,源应该是一个依赖属性,我想CultureFormat不是
如果需要变量区域性信息,可以在ViewModel中使用特定属性格式化数据,如
public string BalanceString
{
get { return String.Format(CultureFormat, "C", Balance); }
}
然后使用此新属性进行绑定:
<DataGridTextColumn Header="Saldo" Binding="{Binding BalanceString, Mode=OneWay}" />
以下是如何使用多重绑定和转换器实现此目的:
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:
该示例假定CultureFormat属性返回一个字符串。如果它返回一个CultureInfo,您可以将值[1]强制转换为这种类型,而不是字符串。现在我正在做类似的事情来解决这个问题。但我想以某种方式对它进行多重绑定,因为在这个数据网格中,我有5个字段,有2种不同的货币。以及其他两个不同型号的数据网格。我只是想找到更好的解决办法,很好。但我仍然看不到如何在xaml中绑定ViewModel中的值?因为当我像Path=MyValueFromViewModel一样绑定时,它会显示任何东西嘿,你的解决方案确实有效,但我只是必须将货币字段更改为,正如我在这个问题中发现的:
<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>