Можем ли мы привязать динамические данные (набор данных или список) к элементу управления в WPF - PullRequest
2 голосов
/ 25 мая 2010

У меня есть пользовательский элемент управления ... и базовые страницы, которые используют этот пользовательский элемент управления, имеют набор данных, который будет использоваться пользовательским элементом управления.

Мой набор данных является динамическим ... значит ... он может иметь разное количество столбцов в зависимости от того, на какой странице реализован мой контроль пользователя. Есть ли какой-либо элемент управления в wpf, который я могу использовать для привязки этого набора данных (не зная информацию столбца) ... я имею в виду аналогично datagrid / gridview в 2.0?

1 Ответ

5 голосов
/ 25 мая 2010

Взгляните на WPF toolkit , он содержит сетку, соответствующую вашим требованиям.

Этот инструментарий создан Microsoft и является частью инициативы Microsoft Shared Source Initiative (см. Предоставленную мной ссылку).

Это не поддерживается моим Microsoft, поэтому, если вы получаете ошибку, вы можете использовать их форумы, но не вызывать поддержку MS.

Если вы хотите сделать это самостоятельно, например, вы можете написать некоторый код, который принимает List<T>, вы получаете универсальный тип, получаете свойства, перебираете их, пишете заголовки столбцов, перебираете все элементы в списке и напишите все свойства.

Я написал этот код некоторое время назад, чтобы записать List в таблицу HTML, надеюсь, это будет полезно:

public void PrintList<T>(List<T> list)
{
    if(null!=list.FirstOrDefault())
    {
       Type t = typeof(list[0]);
       PropertyInfo[] properties = t.GetProperties();

       // properties = list of all properties.

       print("<table><tr>");

       foreach(var property in properties)
       {
          // print property title
          print(string.Format("<th>{0}</th>", property.Name));
       }   


       print("</tr>");

       foreach(var item in list)
       {
          print("<tr>");
          foreach(var property in properties)
          {
               var propertyValue = t.InvokeMember(property.Name, BindingFlags.GetProperty, null, item, new object[] {});
               print(string.Format("<td>{0}</td>", propertyValue));
          }

          print("</tr>");
       }

       print("</table>");
    }
}
...