【问题标题】:Merge DataGrid ColumnHeaders合并 DataGrid ColumnHeaders
【发布时间】:2014-10-18 00:54:15
【问题描述】:

我想合并两个列标题。在您将此问题标记为重复之前,请进一步阅读。我不想要一个超级标题。我只想合并两个列标题。请看下图:

您能看到两列的标题手机号码 1 和手机号码 2?我只想将 1 列标题显示为 Mobile Numbers

这是用于创建上述数据网格的 XAML:

<DataGrid Grid.Row="1" Margin="0,10,0,0" ItemsSource="{Binding Ledgers}" IsReadOnly="True" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Customer Name" Binding="{Binding LedgerName}" />
        <DataGridTextColumn Header="City" Binding="{Binding City}" />
        <DataGridTextColumn Header="Mobile Number 1" Binding="{Binding MobileNo1}" />
        <DataGridTextColumn Header="Mobile Number 2" Binding="{Binding MobileNo2}" />
        <DataGridTextColumn Header="Opening Balance" Binding="{Binding OpeningBalance}" />
    </DataGrid.Columns>
</DataGrid>

更新1:

更新2

我创建了一个转换器如下:

public class MobileNumberFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null && value != DependencyProperty.UnsetValue)
        {
            if (value.ToString().Length <= 15)
            {
                int spacesToAdd = 15 - value.ToString().Length;
                string s = value.ToString().PadRight(value.ToString().Length + spacesToAdd);
                return s;
            }

            return value.ToString().Substring(0, value.ToString().Length - 3) + "...";
        }

        return "";
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我在 XAML 中使用如下:

<DataGridTextColumn Header="Mobile Numbers">
    <DataGridTextColumn.Binding>
        <MultiBinding StringFormat=" {0} {1}">
            <Binding Path="MobileNo1" Converter="{StaticResource mobileNumberFormatConverter}"/>
            <Binding Path="MobileNo2" Converter="{StaticResource mobileNumberFormatConverter}"/>
        </MultiBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>

我得到的输出:

更新3:

最后我得到了想要的输出。

这是转换器的代码:

public class MobileNumberFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null && value != DependencyProperty.UnsetValue)
        {
            if (parameter.ToString().ToUpper() == "N")
            {
                if (value.ToString().Length <= 15)
                {
                    return value.ToString();
                }
                else
                {
                    return value.ToString().Substring(0, 12);
                }
            }
            else if (parameter.ToString().ToUpper() == "S")
            {
                if (value.ToString().Length <= 15)
                {
                    int spacesToAdd = 15 - value.ToString().Length;
                    string spaces = "";
                    return spaces.PadRight(spacesToAdd);
                }
                else
                {
                    return "...";
                }
            }
        }

        return "";
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

这是我的 XAML:

<DataGridTemplateColumn Header="Mobile Numbers">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock>
                <Run Text="{Binding MobileNo1, Converter={StaticResource mobileNumberFormatConverter}, ConverterParameter=N}" />
                <Run Text="{Binding MobileNo1, Converter={StaticResource mobileNumberFormatConverter}, ConverterParameter=S}" FontFamily="Consolas"/>
                <Run Text="   " FontFamily="Consolas"/>
                <Run Text="{Binding MobileNo2, Converter={StaticResource mobileNumberFormatConverter}, ConverterParameter=N}" />
                <Run Text="{Binding MobileNo2, Converter={StaticResource mobileNumberFormatConverter}, ConverterParameter=S}" FontFamily="Consolas"/>
            </TextBlock>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

输出:

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    试试这个

      <DataGridTextColumn Header="Mobile Numbers">
                    <DataGridTextColumn.Binding>
                        <MultiBinding StringFormat=" {0} {1}" Converter="{StaticResource YourConverter}">
                            <Binding Path="MobileNo1"/>
                            <Binding Path="MobileNo2"/>
                        </MultiBinding>
                    </DataGridTextColumn.Binding>
      </DataGridTextColumn>
    

    【讨论】:

    • 在问这个问题之前我已经尝试过了。如果手机号码有不同的号码。位数或万一客户来自国外,那么他的手机号码将与国家代码一起保存,那么位数会有所不同。在这种情况下,输出可能看起来很糟糕。有关更多信息,请参阅相关的 Update1。
    • 它工作正常,但它可能看起来很糟糕,你想调整它吗?
    • 当然,使用MultiConverter(派生自IMultiValueConverter)来实现它。如果您的号码不包含国家/地区代码,则添加两个空格或其他任何内容,它将提供列中的所有值的长度相同。
    • 好的,我会试试,如果我能解决它,请告诉你:)
    • 我试过了,但没有成功。请查看有问题的 update2。
    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2013-06-16
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多