绑定中的 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;
}
我试图在代码隐藏中 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;
}