Привязка массива Xaml к положению на сетке данных - PullRequest
2 голосов
/ 25 марта 2009

У меня есть список строкового массива в качестве входных данных. Измерение массива является статическим для всего списка, но я не могу знать размер массива, пока список не будет получен. Мне нужно связать список в сетке данных в Silverlight.

Я пытался создать столбцы во время выполнения, привязывая каждый столбец к определенной позиции массива, но не могу найти способ.

Ты хоть представляешь, как это сделать?

Я мог бы в конечном итоге "преобразовать" мой список массивов во что-нибудь еще, что могло бы быть связано в сетке данных?

Идея состоит в том, чтобы в сетке данных в Silverlight отображалась некая двумерная матрица (я думаю, что проблема похожа).

Список

 column_1      column_2       column_3   ..   column_m

string[1,1]   string[1,2]    string[1,3] ..  string[1,m]
string[2,1]   string[2,2]    string[2,3] ..  string[2,m]
string[3,1]   string[3,2]    string[3,3] ..  string[3,m]
....
string[n,1]   string[n,2]    string[n,3] ..  string[n,m]

n - длина списка, m - максимальное число столбцов списка.

Любая идея приветствуется

Ответы [ 2 ]

2 голосов
/ 30 марта 2009

Я нашел два решения проблемы, которые используют схему в ответе Дениса:

  • первый - использовать отражение для генерации класса во время выполнения для привязки, как предложено в этой статье (спасибо Владимиру Бодурову) Я протестировал это решение и постараюсь использовать его в своем проекте. Единственная проблема сейчас в том, что для большой коллекции производительность низкая. Но я надеюсь, что кто-то исправит это в следующем выпуске (Silverlight 3, похоже, еще не решил эту проблему)

  • второе решение будет использовать некоторый динамический язык для генерации данных. Я не знаю, может ли это быть быстрее или нет (вероятно, нет), но в конечном итоге может помочь. В будущем я постараюсь использовать ironpython или ruby ​​для создания классов, которые будут связаны в сетке данных.

Если кто-то попытался использовать второе решение или какую-либо связанную с производительностью информацию о создании классов во время выполнения, это будет оценено.

Джорджио

1 голос
/ 25 марта 2009

К сожалению, это будет нелегко.

Есть ли у вас действительные ограничения, например, максимально допустимое количество столбцов или что-то подобное? Если вы это сделаете (скажем, у вас есть максимум N столбцов), вы можете сделать что-то с помощью

  1. Наличие класса, который выставляет N свойства (с именем Col1 ... ColN для пример) которые отображают содержание массива для одной строки в столбце X
  2. Создание списка этого класса, один экземпляр для каждой строки
  3. Генерация правильного числа колонка на лету, связывая каждый столбец для свойства ColX
  4. Привязка вашей DataGrid к этому списку

Это некрасиво, но это сработает.

Если вам не нужно полагаться на DataGrid, существует возможность использования UniformGrid. UniformGrid - это панель, которая размещает своих дочерних элементов в регулярной сетке (каждый элемент имеет одинаковую ширину, каждый элемент имеет одинаковую высоту). Вы можете указать количество столбцов во время выполнения, и панель будет соответствовать дочерним элементам один за другим до количества столбцов, а затем перейдет к другой строке. Вы можете привязать ItemsControl к вашему массиву, указав, что он должен использовать UniformGrid в качестве панели макета, и указав подходящий ItemTemplate для рендеринга каждой строки.

Второй вариант намного проще, но у вас не будет таких возможностей DataGrid, как сортировка, перемещение столбцов, выбор строки, редактирование событий в строке и т. Д.

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