2011-08-10 60 views
0

我想在幾個簡單的DataGrid中顯示二進制文件的內容(xmlns:kit =「http://schemas.microsoft.com/wpf/2008/toolkit 「)。我知道文件的佈局;這很簡單。簡單的WPF綁定問題。將DataGrid綁定到結構的一個結構和數組(列表)

首先,我有如下形式的幾個簡單的結構:

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

} 

我只有一個文件中的這些intance。雖然它可能是矯枉過正,但我​​想把它放在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的綁定(如果它很簡單,我不反對),或者是過度設置(設置列名等)。

感謝,

戴夫

回答

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列,那麼您需要指定一個Converter來格式化數組,或者如果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" /> 
+0

完美!謝謝,並標記爲答案。我可以問一個獎金問題嗎?如果我將站點代碼作爲公共字節[] StationCode {get;設置;},我會怎麼做,所以字節出現在網格?目前,它是空白的。我猜我得到int,單位等。免費的,但是byte []有必要的某種格式。 – Dave

+0

謝謝脂肪!我使用了兩個想法(字符串格式和轉換器)。像魅力一樣工作。 – Dave

0

揭露領域的公共屬性和它可能工作。