简单的WPF绑定问题。将DataGrid绑定到一个结构和结构数组(列表)
我想在几个简单的数据网格中显示二进制文件的内容(xmlns:kit=”http://schemas.microsoft.com/wpf/2008/toolkit"). 我知道文件的布局;这很简单 首先,我有几个简单的表单结构:简单的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
[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等,但是字节[]需要某种格式。谢谢!我使用了两种方法(字符串格式和转换器)。工作得很有魅力。