Mar*_*s k 37 c# wpf binding currentculture
就我而言:
我有一个TextBlock绑定到DateTime类型的属性.我希望它显示为用户的区域设置.
<TextBlock Text="{Binding Date, StringFormat={}{0:d}}" />
Run Code Online (Sandbox Code Playgroud)
我将语言属性设置为WPF XAML Bindings和CurrentCulture Display 说:
this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);
Run Code Online (Sandbox Code Playgroud)
但是使用这行代码,它只是将文本显示为CultureInfo的默认格式,并使用CurrentCulture的IetfLanguageTag表示,而不是在系统区域设置中选择的有效值表示:
(例如,对于"de-DE" dd.MM.yyyy用于代替选定的yyyy-MM-dd)

有没有一种方法Binding使用正确的格式而不在每个Binding上定义ConverterCulture?
在代码中
string.Format("{0:d}",Date);
Run Code Online (Sandbox Code Playgroud)
使用正确的文化设置.
编辑:
另一种不能按预期工作的方式(比如this.Language = ......):
xmlns:glob="clr-namespace:System.Globalization;assembly=mscorlib"
Run Code Online (Sandbox Code Playgroud)
和
<Binding Source="{x:Static glob:CultureInfo.CurrentCulture}"
Path="IetfLanguageTag"
ConverterCulture="{x:Static glob:CultureInfo.InvariantCulture}" />
Run Code Online (Sandbox Code Playgroud)
aKz*_*enT 27
您可以创建一个绑定子类(例如CultureAwareBinding),它在创建时自动将ConverterCulture设置为当前文化.
它不是一个完美的解决方案,但它可能是唯一的解决方案,因为追溯强制Binding以尊重文化可能会破坏WPF中依赖于此行为的其他代码.
如果您需要更多帮助,请告诉我们!
Par*_*hah 18
这是来自aKzenT的答案的延伸.他们建议我们应该创建一个Binding类的子类,并将ConverterCulture设置为CurrentCulture.虽然答案非常简单,但我觉得有些人可能不太习惯实现它,所以我正在分享aKzenT答案的代码版本,并举例说明如何在XAML中使用它.
using System;
using System.Globalization;
using System.Windows.Data;
namespace MyWpfLibrary
{
public class CultureAwareBinding : Binding
{
public CultureAwareBinding()
{
ConverterCulture = CultureInfo.CurrentCulture;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何在XAML中使用它的示例
1)您需要将名称空间导入XAML文件:
<Page
...
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:myWpfLib="clr-namespace:MyWpfLibrary;assembly=<assembly_name>"
...
>
Run Code Online (Sandbox Code Playgroud)
2)CultureAwareBinding的真实世界用法
<Textblock Text="{myWpfLib:CultureAwareBinding Path=Salary, Source=Contact, StringFormat={}{0:C}}" />
Run Code Online (Sandbox Code Playgroud)
小智 6
在初始化任何UI之前,请输入以下代码行.这对我有用.
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),
new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
Run Code Online (Sandbox Code Playgroud)
(并删除所有显式文化参数)
| 归档时间: |
|
| 查看次数: |
38305 次 |
| 最近记录: |