在Windows Phone 7中,IValueConverter获取错误的文化信息

7

我在我的Windows Phone 7中创建了一个值转换器...

public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // ...
    }

    // ... 
}

... 并且可以像这样使用它 ...

<TextBlock Text="{Binding SomeField, Converter={StaticResource MyConverter}, ConverterParameter=SomeParameter}" <!-- ... --> />

我的问题是:Convert方法的argument文化总是“en-US”,即使我更改了Windows Phone设备(或模拟器)的文化,比如说德国的德语,culture参数仍然是英语。
3个回答

6

这不是一个错误,而是一种预期行为。请参考 MSConnect 上的这篇文章:WPF Binding 默认使用错误的 CurrentCulture

解决方法是将你的 PhoneApplicationPageLanguage 属性设置为当前区域设置,像这样:

Language = XmlLanguage.GetLanguage(
    Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName);

或者在XAML中使用Language属性指定文化,如下所示:

<TextBlock Language="de-DE" Text="..." />

或者在PhoneApplicationPage本身上。
<phone:PhoneApplicationPage Language="de-DE" ...

但更好的解决方案是不要有一个依赖于“culture”参数的值转换器。

编辑:我写了一篇关于另一种解决方案的博客:ValueConverter中的DateTime格式化


你的第一个建议听起来不错,我应该把它放在我的页面构造函数中还是稍后调用的事件中? - Hinek
好的,但现在文化参数是“de”,而不是“de-DE”,这会导致在任何.Format方法中使用它时出现IndexOutOfRange异常(尝试过DateTime和String)... - Hinek
1
好的。如果您需要子文化,可以尝试使用“Name”属性而不是“TwoLetterISOLanguageName”。但是,我强烈建议不要在转换器中编写与文化相关的代码。 - Claus Jørgensen
ValueConverters的作用是始终以相同的方式进行转换,因此您可以编写一个带有格式参数的转换器,然后将转换器参数绑定到(静态)资源(绑定)。或者您可以在ViewModel中执行日期时间格式化(我认为这是最佳方法)。 - Claus Jørgensen
@Hinek 让我们在聊天室里继续这个讨论 - Claus Jørgensen
显示剩余2条评论

1

我刚遇到了这个问题。

我使用以下方法解决了它:

public object Convert(object value, Type targetType, object parameter,  System.Globalization.CultureInfo culture)
{   
    return string.Format(culture, "{0:N}, value);   
}

使用 Culture 进行转换控制,但您还必须确保将 value 参数保留为对象。更改其类型会影响 string.Format 与其交互的方式。

抱歉,但这如何解决包含错误值的文化问题(en-US而不是手机设置中配置的文化)? - Hinek
啊,抱歉。这可能会有所帮助。它描述了这个问题和一个解决方法:http://forums.create.msdn.com/forums/t/88151.aspx - Faster Solutions

1

你尝试过查找CurrentCulture吗?

可能是WP7中没有传递该值的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接