将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导出无效,虽然一些有趣的事情发生在调试器…

将StringFormat结果强制转换为“对象”;目标类型

使用标记扩展名动态创建字符串格式转换器:

<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;
    }
}