绑定中的 WPF StringFormat 在代码隐藏中不起作用

WPF StringFormat in Binding doesn't work in code behind

我试图在代码隐藏中 100% 以编程方式创建 DataTemplate。一切正常,除了文本块中文本绑定的 StringFormat 不起作用。

通常在 xaml,我会这样完成:

<TextBlock Text={Binding MyProperty, StringFormat=0.0} />

所以我假设我可以设置 Binding 对象的 StringFormat 属性,我做到了。我确认它设置正确,确实如此,但我的视图仍然没有反映格式。为什么?

这是我的代码的摘录:一个为我动态创建 DataTemplate 的函数。从字面上看,其他一切都完美无缺,从设置绑定路径到 ivalue 转换器,以及一切。只是不是字符串格式。

string propertyName = "myPropertyName";
FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBlock));

// the property I want is owned by myObject, which is a property of the datacontext
string bindingString = String.Format("myObject[{0}]", propertyName); 
Binding binding = new Binding(bindingString)
{
    Mode = BindingMode.OneWay,
    Converter = (IValueConverter)Application.Current.FindResource("InvalidValuesConverter"),
    StringFormat = "{0:F1}" // <-- Here is where I specify the stringFormat. I've also tried "0.0"
};

textBlock.SetBinding(TextBlock.TextProperty, binding);

看起来您看到的是正在应用 StringFormat,但它不会对您的转换器正在 return 的字符串值进行数字格式化。由于您使用的特定格式除了数字格式外什么都没有,因此在非 NaN 情况下,转换器 + StringFormat 处理实际上是无操作。测试这个假设的最快方法是给它一个像 N={0:#} 这样的格式,我就是这么做的。它将十进制 3.5 格式化为 "N=4",将字符串 "3.5" 格式化为 "N=3.5"

当然,values are passed through the converter before they're formatted.

由于您的转换器的唯一目的是用空字符串替换 Double.NaN,我建议您的转换器仅在 NaN 情况下转换为字符串,否则 return double 值原样。 Convert returns object 所以没问题。

为简单起见,下面的代码假定您可以指望 value 始终是 double

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (double.IsNaN((double)value)) 
            ? "" 
            : value;
    }