Как отобразить реальные табличные данные с WPF? - PullRequest
0 голосов
/ 25 августа 2010

У меня следующая проблема: мне нужно отображать табличные данные в какой-то сетке.

Скажем, класс A - это элемент данных со свойствами Foo и Bar, и у меня есть список элементов List или sth, как это. Я хочу отобразить эти элементы в сетке, где элементы с одинаковыми значениями Foo находятся в одном столбце, а элементы с одинаковыми значениями Bar в одной строке. основной. просто. я думал?

Моя первоначальная попытка состояла в том, чтобы создать ItemsControl, использовать Grid в качестве ItemsPanelTemplate и ItemsTemplate, где я привязал присоединенные свойства Grid.Row и Grid.Column к A.Foo и A.Bar, используя IValueConverters для привязки определенного Foo с определенной колонкой, например преобразователь будет искать значение Foo в виде массива Columns и возвращать правильный индекс. Дело в том, что строим определения строк и столбцов для Grid. Поскольку они являются полностью динамическими (я не знаю во время разработки, какие Foo и Bar будут в исходной коллекции), я не могу определить их в файле xaml. Но во время выполнения ItemsControl действительно не предоставляет доступ к текущему экземпляру ItemsPanel. Единственным способом, который я нашел, был грязный способ использования VisualTreeHelper.GetChild, и мне удалось получить экземпляр ItemsPanel и создать необходимые Row- и ColumnDefinitions, но мои элементы ItemTemplate-d просто не будут отображаться в правой строке и столбце, хотя мои конвертеры вернули правильные индексы столбца / строки. Может быть, я не очень понимаю, как ItemsControl работает внутри, но дело в том, что я вне идей.

Кто-то предложил использовать ListView с GridView, сгруппировав мои элементы той же панели в другом объекте, это избавило бы меня от динамического создания строк, но динамическое создание столбцов кажется довольно сложным.

У кого-нибудь есть идея или хотя бы намек? Я что-то упустил очевидное?

Ответы [ 2 ]

0 голосов
/ 25 августа 2010

Поскольку вы упомянули о возможности перехода к ListView, я подумал, что вместо этого рекомендую использовать DataGrid, поскольку после загрузки данных в DataTable DataGrid выполняет всю работу за вас, чтобы генерировать столбцы и строки.

Вот некоторый рабочий код, который я скопировал, чтобы вы начали.

Вот привязка для DataGrid:

<WpfToolkit:DataGrid
            IsReadOnly="True"
            IsTabStop="False"
            ItemsSource="{Binding Path=GridData, Mode=OneWay}">
</WpfToolkit:DataGrid>

Определите свойство для привязки XAML в классе (я используюшаблон MVVM):

private DataTable _dt = new DataTable("MyDataTable");
public DataView GridData
{
   get
   {
      return _dt.DefaultView;
   }
}

Добавьте столбцы данных в таблицу данных следующим образом:

DataColumn fileType = new DataColumn("FileType");
fileType.AllowDBNull = true;
fileType.DataType = typeof(string);
_dt.Columns.Add(fileType);

Добавьте строки данных в таблицу данных следующим образом:

DataRow dr = _dt.NewRow();
dr["FileType"] = "*.txt";
_dt.Rows.Add(dr);

Сбросьте строки и столбцы следующим образом:

_dt.Rows.Clear();
_dt.Columns.Clear();

Использование этих частей - все, что мне нужно для динамической генерации DataGrid.

0 голосов
/ 25 августа 2010

Хорошо, я действительно должен перестать работать ночью, в новый день, с ясной головой, и я нашел решение довольно быстро.В основном, здесь ответили Установка свойств Canvas в DataCemprol DataTemplate ItemsControl .Мне пришлось использовать ItemContainerStyle, чтобы установить Grid.Row и Grid.Column для моих отображаемых элементов, или, скорее, обертку ContentPresenter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...