如果属性为空,则合并列

时间:2014-11-20 10:11:16

标签: c# wpf listview wpfdatagrid

我有一个带有一些字符串属性的类,每个类在数据网格中显示为一行。每个属性都有自己的列。如果两个相邻属性为空,我想合并该特定行的这两列。只要它完成工作,我就可以使用datagrid或listview。 E.g。

public class MyClass
{
    string name { get; set;}
    string age { get; set;}
    string sex { get; set;}
    double income { get; set;}
}

Merged Column

1 个答案:

答案 0 :(得分:1)

最好在这些情况下使用ItemsControl。我的建议是使用Grid作为ItemsPanel,而不是说100个MyClass实例,实现一个Cell类并使用其中的400个(每个用于一个单元格)并在代码中设置它们的确切行和列。

您需要一个GridHelper,您可以找到它in this link

public class Cell
{
    public int RowIndex { get; set; }
    public int ColumnIndex { get; set; }
    public int ColumnSpan { get; set; }
    public string Data { get; set; }
    public CellType CellType { get; set; } //you can also add an enum for CellType
}

<ItemsControl ItemsSource="{Binding AllCells}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid 
                v:GridHelper.ColumnsCount="{Binding TotalColumns}"
                v:GridHelper.RowsCount="{Binding TotalRows}">
            </Grid>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Grid.Row" Value="{Binding Path=RowIndex}"/>
            <Setter Property="Grid.Column" Value="{Binding Path=ColumnIndex}"/>
            <Setter Property="Grid.ColumnSpan" Value="{Binding Path=ColumnSpan}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>

如果您需要不同类型的单元格,可以将其添加到ItemContainerStyle:

<Style.Triggers>
    <DataTrigger Binding="{Binding Path=CellType}" Value="NumericCellType">
        <Setter Property="ContentTemplate" Value="{StaticResource templateNumericCell}"/>
    </DataTrigger>
    <DataTrigger Binding="{Binding Path=CellType}" Value="GeneralCellType">
        <Setter Property="ContentTemplate" Value="{StaticResource templateGeneralCell}"/>
    </DataTrigger>
</Style.Triggers>

否则你可以实现一个模板:

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <TextBox Text="{Binding Data}"/>
    </DataTemplate>
</ItemsControl.ItemTemplate>