2011-08-10 5 views
0

Я хочу отобразить содержимое двоичного файла в нескольких простых DataGrids (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; 

} 

У меня есть только один из них входом в инстанс в файле. Хотя это, вероятно, слишком много, я бы хотел бросить его в 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 (к которой я не против, если это легко) или переполнен (установка имен столбцов и т. Д.).

Спасибо,

Dave

ответ

0

Определите класс как

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

и установить AutoGenerateColumns свойство DataGrid в True (если вы не хотите, чтобы определить столбцы вручную)

С этими изменениями, я был в состоянии получить следующий код для работы:

m_gridPartition1.ItemsSource = new PartitionBasicData[] { new PartitionBasicData() { latitude = 1, longitude = 2, StationCode = 3 }};


РЕДАКТИР поставленный вопрос в комментарии:

В этом случае вам нужно будет удалить атрибут AutoGenerateColumns и определить столбцы вручную (как вы будете указать пользовательский столбец для StationCode собственности)

Для столбец StationCode, вам нужно будет указать конвертер для форматирования вашего массива, или, альтернативно, если байт [] всегда находится в известной длине и формате, вы можете просто указать свойство StringFormat привязки.

Оба метода потребуют от вас установить значение CanUserSort в этом столбце False или установить для свойства SortMemberPath что-то, что не требует преобразования, чтобы исключение во время выполнения не было выбрано, когда пользователь нажимает на столбец заголовок. Или, поскольку в этот DataGrid есть только одна строка, как указано в вашем исходном вопросе, вы можете установить свойство CanUserSortColumns на DataGrid равным 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; set;}, что бы я сделал, чтобы байт появился в сетке? В настоящее время это пусто. Я предполагаю, что получаю int, единицы и т. Д. бесплатно, но для байта [] необходимо какое-то форматирование. – Dave

+0

Спасибо, жирный! Я использовал обе идеи (String Format и Converter). Работал как шарм. – Dave

0

Expose поля в качестве открытых свойств и он может работать.

Смежные вопросы