我有一个带有一些字符串属性的类,每个类在数据网格中显示为一行。每个属性都有自己的列。如果两个相邻属性为空,我想合并该特定行的这两列。只要它完成工作,我就可以使用datagrid或listview。 E.g。
public class MyClass
{
string name { get; set;}
string age { get; set;}
string sex { get; set;}
double income { get; set;}
}
答案 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>