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

时间:2011-08-10 22:25:16

标签: wpf data-binding

我想在几个简单的DataGrids中显示二进制文件的内容(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;

}

我在文件中只有一个这样的内容。虽然它可能有点过分,但我想把它扔进Datagrid。我希望我能自动获得一些简单的列标题,如“经度”,“纬度”等。我的XAML看起来像:

<kit:DataGrid Name="m_gridPartion1" MinWidth="120" MinHeight="120"></kit:DataGrid>

在代码中,在我成功读取二进制文件并创建结构后,我这样做:

m_gridPartion1.ItemsSource = new Partition1[1] { partition1 };
//m_gridPartion1.DataContext = new Partition1[1]{partition1}; // also tried this
// m_gridPartion1.ItemsSource = partion1; // and I tried this

这应该有用吗?

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

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

}

我希望我能做这样的事情:

 m_gridData.ItemsSource = myList;  // myList is List<Datum>

任何教程或指针都将非常感激。我遇到的大部分材料都是关于XAML的绑定(如果这很容易,我不反对)或者是过度杀戮(设置列名等)。

谢谢,

戴夫

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

将您的班级定义为

[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.ItemsSource = new PartitionBasicData[] { new PartitionBasicData() { latitude = 1, longitude = 2, StationCode = 3 }};


修改评论中提出的问题:

在这种情况下,您需要删除AutoGenerateColumns属性并手动定义列(因为您将为StationCode属性指定自定义列)

对于StationCode列,您需要指定一个转换器来格式化数组,或者如果byte []总是处于已知长度和格式,您可以只指定Binding的StringFormat属性

这两种方法都要求您将该列的CanUserSort属性设置为False,或将SortMemberPath属性设置为不需要转换的属性,以便运行时异常不会用户单击列标题时抛出。或者,由于原始问题中指定的此DataGrid只有一行,因此可以将DataGrid上的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>

StringFormat方法:

<DataGridTextColumn Header="Station Code" Binding="{Binding Path=StationCode, StringFormat='{}{0}-{1}-{2}'}" CanUserSort="False" />