将StringFormat结果强制转换为“对象”;目标类型
本文关键字:对象 目标 类型 结果 StringFormat 转换 | 更新日期: 2023-09-27 18:13:19
我试图使用StringFormat
而不是转换器在DevExpress网格列标题中呈现一些文本,来自MultiBinding.
Header
属性为object
类型,但StringFormat要求目标类型为string.
类型
我尝试使用TextBlock
作为包装器,其Text
属性是string,
,但这会导致导出网格到Excel的问题-列标头无效。我尝试编写自定义DataTemplate
来修复导出,但遇到了困难,而是想探索以下内容:
我想创建一个自定义类型,可以这样使用:
<dxg:GridColumn.Header>
<local:XamlStringWrapper>
<MultiBinding StringFormat="{}{0} - {1}">
<Binding Path="Prop1" />
<Binding Path="Prop2" />
</MultiBinding>
</local:XamlStringWrapper>
</dxg:GridColumn.Header>
所以它会接受StringFormat
的结果,但除此之外,从列标题的角度来看,它也会像string
一样…这样,如果我访问GridColumn.Header
,我将得到一个类型为string.
的对象,这样导出将正常工作。
我的尝试是:
[ContentProperty("Content")]
public class XamlStringWrapper : FrameworkElement
{
public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register("Content",
typeof (string),
typeof (XamlStringWrapper),
new PropertyMetadata(null));
public string Content
{
get { return (string) GetValue(ContentProperty); }
set { SetValue(ContentProperty, value); }
}
// When the column Header "reads" this object, does it always pull from ToString?
public override string ToString()
{
return Content;
}
}
我想做的是可能的吗?它并不是真正与上述(简化)代码工作-列标题是空白的应用程序,并在excel导出无效,虽然一些有趣的事情发生在调试器…
使用标记扩展名动态创建字符串格式转换器:
<dxg:GridColumn.Header>
<MultiBinding Converter="{me:StringFormat {}{0}:{1}}">
<Binding Source="Cake"/>
<Binding Source="Lie"/>
</MultiBinding>
</dxg:GridColumn.Header>
public class StringFormatExtension : MarkupExtension, IMultiValueConverter
{
public string FormatString { get; private set; }
public StringFormatExtension(string formatString)
{
if (formatString == null) throw new ArgumentNullException("formatString");
FormatString = formatString;
}
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return String.Format(FormatString, values);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}