简单的WPF绑定问题。将DataGrid绑定到一个结构和结构数组(列表)

简单的WPF绑定问题。将DataGrid绑定到一个结构和结构数组(列表),wpf,data-binding,Wpf,Data Binding,我想在几个简单的数据网格中显示二进制文件的内容(xmlns:kit=”http://schemas.microsoft.com/wpf/2008/toolkit"). 我知道文件的布局;这很简单 首先,我有几个简单的表单结构: [StructLayout(LayoutKind.Sequential, Pack = 1)] public class PartitionBasicStationData { public uint longitude; public uint latitud

我想在几个简单的数据网格中显示二进制文件的内容(xmlns:kit=”http://schemas.microsoft.com/wpf/2008/toolkit"). 我知道文件的布局;这很简单

首先,我有几个简单的表单结构:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class PartitionBasicStationData
{
  public uint longitude;
  public uint latitude;
  public uint StationCode;

}
我的档案里只有一份。虽然这可能有点过头了,但我还是想把它放到数据网格中。我希望能自动获得一些简单的列标题,如“经度”、“纬度”等。我的XAML如下所示:

<kit:DataGrid Name="m_gridPartion1" MinWidth="120" MinHeight="120"></kit:DataGrid>
这样行吗

对于我的第二个网格,我也将有简单的结构,但其中很多。结构看起来像

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class Datum
{
  public uint temperature;
  public uint windVelocity;

}
我希望我能像这样做:

 m_gridData.ItemsSource = myList;  // myList is List<Datum>
m_gridData.ItemsSource=myList;//我的列表是一个列表
任何教程或指导都将不胜感激。我遇到的大多数材料都是关于从XAML绑定的(如果很容易的话,我并不反对),或者是过于复杂(设置列名等)

谢谢


Dave

将字段公开为公共属性,这可能会起作用。

将类定义为

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class PartitionBasicData
{
    public uint longitude { get; set; }
    public uint latitude { get; set; }
    public uint StationCode { get; set; }
}
并将DataGrid的
AutoGenerateColumns
属性设置为True(如果不想手动定义列)

通过这些更改,我能够使以下代码正常工作:

m_gridPartition1.itemsource=new PartitionBasicData[]{new PartitionBasicData(){纬度=1,经度=2,StationCode=3}


编辑评论中提出的问题:

<DataGrid Name="m_gridPartition1">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Longitude" Binding="{Binding Path=longitude}" />
        <DataGridTextColumn Header="Latitude" Binding="{Binding Path=latitude}" />
        <DataGridTextColumn Header="Station Code" Binding="{Binding Path=StationCode, Converter={StaticResource someConverterToStyliseByteArray}}" CanUserSort="False" />
    </DataGrid.Columns>
</DataGrid>
<DataGridTextColumn Header="Station Code" Binding="{Binding Path=StationCode, StringFormat='{}{0}-{1}-{2}'}" CanUserSort="False" />
在这种情况下,您需要删除
AutoGenerateColumns
属性并手动定义列(因为您将为
StationCode
属性指定自定义列)

对于StationCode列,则需要指定一个转换器来格式化数组,或者,如果字节[]始终处于已知长度和格式,则可以只指定绑定的
StringFormat
属性

这两种方法都要求您将该列上的
CanUserSort
属性设置为False,或者将
SortMemberPath
属性设置为不需要转换的属性,以便在用户单击列标题时不会引发运行时异常。或者,由于原始问题中指定的数据网格只有一行,因此可以将数据网格上的
CanUserSortColumns
属性设置为False

转换器方法:

<DataGrid Name="m_gridPartition1">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Longitude" Binding="{Binding Path=longitude}" />
        <DataGridTextColumn Header="Latitude" Binding="{Binding Path=latitude}" />
        <DataGridTextColumn Header="Station Code" Binding="{Binding Path=StationCode, Converter={StaticResource someConverterToStyliseByteArray}}" CanUserSort="False" />
    </DataGrid.Columns>
</DataGrid>
<DataGridTextColumn Header="Station Code" Binding="{Binding Path=StationCode, StringFormat='{}{0}-{1}-{2}'}" CanUserSort="False" />

StringFormat方法:

<DataGrid Name="m_gridPartition1">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Longitude" Binding="{Binding Path=longitude}" />
        <DataGridTextColumn Header="Latitude" Binding="{Binding Path=latitude}" />
        <DataGridTextColumn Header="Station Code" Binding="{Binding Path=StationCode, Converter={StaticResource someConverterToStyliseByteArray}}" CanUserSort="False" />
    </DataGrid.Columns>
</DataGrid>
<DataGridTextColumn Header="Station Code" Binding="{Binding Path=StationCode, StringFormat='{}{0}-{1}-{2}'}" CanUserSort="False" />


完美!谢谢,并标记为答案。我能问一个额外的问题吗?如果我将站点代码设置为公共字节[]StationCode{get;set;},我将如何使该字节显示在网格中?目前,它是空白的。我猜我可以免费获得int、units等,但是字节[]需要某种格式。谢谢!我使用了两种方法(字符串格式和转换器)。工作得很有魅力。