数据网格中对象的矩阵表示

时间:2018-07-17 12:42:21

标签: c# wpf mvvm datagrid

我需要将对象列表表示为矩阵。矩阵的大小始终为16x16。

该对象仅包含3个字段:

library(tidyverse)
expand.grid(a, b) %>%
    rowwise() %>%
    mutate(res = list(ff(X, Var1, Var2))) %>%
    ungroup() %>%
    spread(Var1, res)
## A tibble: 4 x 4
#   Var2 `1`        `2`        `3`
#  <dbl> <list>     <list>     <list>
#1    4. <list [2]> <list [2]> <list [2]>
#2    5. <list [2]> <list [2]> <list [2]>
#3    6. <list [2]> <list [2]> <list [2]>
#4    7. <list [2]> <list [2]> <list [2]>  

在每个单元格内仅应显示 data 字段的值,并且每个单元格都应可更新

我试图用private byte deviceAddress; private byte register; private byte[] data; 作为返回对象来实现某些转换器,但是每次执行转换时,数据网格都会闪烁并绘制新的列和行(这是不可接受的)。

也许存在某种写数据模板的方法来表示这一点?

预期结果应如图所示:

Result

1 个答案:

答案 0 :(得分:1)

假设您的数据存储在这样的类中:

public class MyItem
{
    public byte deviceAddress { get; set; }
    public byte register { get; set; }
    public byte[] data { get; set; }
}

并且您有256个此类对象的列表

public List<MyItem> MyMatrix { get; set; }

您可以将ItemsControlUniformGrid用作ItemsPanel:

<ItemsControl ItemsSource="{Binding MyMatrix}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="16"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding data,
                     Converter={StaticResource yourDataToStringConverter}}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

如果需要选择一个项目,请使用ListBox而不是ItemsControl。

请注意,必须将Window的DataContext设置为具有MyMatrix属性的类的实例,并且需要IValueConverter的实现,该实现将data转换为适当的字符串表示形式(或其他任何形式)