如何在XAML中正确显示当前区域文化的十进制分隔符
问题原因与正确实现方案
原有写法的错误点
- 第一种
{Binding CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator}写法的问题:默认Binding会从当前控件的DataContext中查找属性,你的DataContext中没有定义CultureInfo相关属性,所以找不到绑定源,绑定会失败。 - 第二种
{Binding Source={x:Static CultureInfo.CurrentCulture.NumberFormat}, Path=NumberDecimalSeparator}写法的问题:x:Static扩展仅支持直接访问静态成员,不支持在静态成员后拼接实例属性访问链,NumberFormat是CultureInfo实例的属性,不能写在x:Static的参数中。
正确实现方式
步骤1:先引入System.Globalization命名空间映射
在XAML文件的根节点(比如Window、UserControl)中添加命名空间声明:
<!-- .NET Core/.NET 5+ 用这个 --> xmlns:sys="clr-namespace:System.Globalization;assembly=System.Runtime" <!-- .NET Framework 用这个 --> xmlns:sys="clr-namespace:System.Globalization;assembly=mscorlib"
步骤2:编写正确的绑定表达式
直接用静态的CurrentCulture作为绑定源,再通过Path访问实例属性链即可:
<TextBlock Text="{Binding Source={x:Static sys:CultureInfo.CurrentCulture}, Path=NumberFormat.NumberDecimalSeparator}"/>
进阶:运行时跟随系统区域设置自动更新
上面的写法只会在界面初始化时读取一次分隔符,如果需要用户修改系统区域设置后界面自动更新,你可以在ViewModel中封装一个通知属性:
public class MainViewModel : INotifyPropertyChanged { public string NumberDecimalSeparator => CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; // 监听到系统区域变更时调用这个方法触发界面更新 public void OnCultureChanged() { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(NumberDecimalSeparator))); } public event PropertyChangedEventHandler PropertyChanged; }
然后XAML直接绑定到这个属性即可:
<TextBlock Text="{Binding NumberDecimalSeparator}"/>
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

