每个单元定义填充矩阵

时间:2014-03-05 14:25:08

标签: c# wpf matrix grid

我需要在像矩阵这样的视图中显示和编辑我的数据。所有数据都将在ObserverableCollection中收集。然后我将填充每个单元格定义的集合。每个单元格定义都有它的行和列的键,以及一个字符串,应该在矩阵中显示。

public class CellViewModel : ViewModelBase
{
    public object RowKey { get; set; }    
    public object ColumnKey { get; set; }
    public string CellText { get; set; }
}

这意味着,当一个CellViewModel被添加到集合中,并且已经存在具有相同RowKey的行时,该单元格将被填充到该行的合适列中。如果该列不存在,则将添加新列。密钥可以是任何对象,该人可以添加具有任何对象密钥的单元格,并且不需要关心设置单元格的正确位置。例如,我使用CellViewModels填充集合:

GridCellViewModelCollection = new ObservableCollection<CellViewModel>
{
    new CellViewModel
    {
        RowKey = 1,
        ColumnKey = 1,
        CellText = "Cell1_1"
    },
    new CellViewModel
    {
        RowKey = "string",
        ColumnKey = 'char',
        CellText = "Cell2_2"
    },
    new CellViewModel
    {
        RowKey = 3,
        ColumnKey = 1,
        CellText = "Cell3_1"
    },
    new CellViewModel
    {
        RowKey = 1,
        ColumnKey = 3,
        CellText = "Cell1_3"
    },
    new CellViewModel
    {
        RowKey = 3,
        ColumnKey = 'char',
        CellText = "Cell3_2"
    }
}

那么矩阵看起来应该是这样的:

        column1 column2 column3
row1    Cell1_1         Cell1_3
row2            Cell2_2
row3    Cell3_1 Cell3_2

我尝试过使用ItemsControl并将整个集合转换为适合带有占位符的ItemsControl ...

var list = new List<CellViewModel>{ null, null, cellViewModel };

但我认为这不是一个好主意。占位符不会保留整个矩阵的良好状态。除了ItemsControl没有行和列的标题。

有任何想法或建议吗?我应该使用哪种控制?

1 个答案:

答案 0 :(得分:1)

您可以在ItemsControl中将Grid用作ItemsPanel,并将Grid.ColumnGrid.Row属性绑定到ItemContainerStyle中的样式中。当然,列和行索引是从零开始的。

<ItemsControl ItemsSource="{Binding GridCellViewModelCollection}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid IsItemsHost="True">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
            </Grid>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Grid.Column" Value="{Binding ColumnKey}"/>
            <Setter Property="Grid.Row" Value="{Binding RowKey}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding CellText}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>