Привязка словаря к ListView WPF - PullRequest
2 голосов
/ 04 марта 2010

У меня есть список, который содержит элементы словаря. Это значит

Список [0] = Элемент словаря => Элемент [0] = идентификатор, Элемент [1] = Имя, Элемент [2] = Количество.

Мне нужно показать это в элементе управления ListView в виде сетки. Словарь может варьироваться.

ОБНОВЛЕНИЕ:

Каждый элемент в списке выглядит так:

["_ id"] = "11212131" ["Title"] = "это заголовок" ["DateCreated"] = "некоторая дата"

Элементы внутри словаря могут быть разными.

ОБНОВЛЕНИЕ 2:

Я использую следующий код для создания динамического элемента управления Gridview, а затем добавляю столбцы в элемент управления GridView. Это работает, но теперь есть длинная горизонтальная линия тех же повторяющихся столбцов. Мне нужно отобразить имя столбца и под ним данные, которые принадлежат этому столбцу.

  var gridview = new GridView();

            foreach (var o in objs)
            {
                var dic = o as Dictionary<String, Object>;
                var enumerator = dic.GetEnumerator();
                while (enumerator.MoveNext())
                {
                    var current = enumerator.Current;
                    var gridViewColumn = new GridViewColumn();
                    gridViewColumn.Header = current.Key; 
                    var binding = new Binding(current.Key);
                    //binding.Source = current;

                    gridViewColumn.DisplayMemberBinding = binding;

                    gridview.Columns.Add(gridViewColumn);

                }

                // new row 

            }

            lvCollections.View = gridview; 

ОБНОВЛЕНИЕ 3:

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

 var gridview = new GridView();


            foreach (var o in objs)
            {

                var dic = o as Dictionary<String, Object>;
                var enumerator = dic.GetEnumerator();
                while (enumerator.MoveNext())
                {var gridViewColumn = new GridViewColumn(); 
                    var current = enumerator.Current;
                    gridViewColumn.Header = current.Key;
                    var binding = new Binding();
                    binding.Source = current; 
                    binding.Path = new PropertyPath("Value"); 

                    gridViewColumn.DisplayMemberBinding = binding;
                    gridview.Columns.Add(gridViewColumn);

                }


                // new row 

            }

            lvCollections.ItemsSource = objs; 
            lvCollections.View = gridview; 

Ответы [ 3 ]

4 голосов
/ 04 марта 2010

Создайте ItemTemplate в вашем ListView, и если вы хотите поместить обе пары ключ / значение в ваш список, вы можете сделать что-то вроде этого:

<ListBox ItemsSource="{Binding Source={StaticResource YourDataObject}}">

 <ListBox.ItemTemplate>

  <DataTemplate>

   <StackPanel Orientation="Horizontal">

    <Label Content="{Binding Key}" />

    <TextBlock xml:space="preserve"></TextBlock>

    <Label Content="{Binding Value}" />

   </StackPanel>

  </DataTemplate>

 </ListBox.ItemTemplate>

</ListBox>
3 голосов
/ 04 марта 2010

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

public void OnDataContextChanged(...)
{
  var distinctKeys = (
    from dict in (List<Dictionary<string,object>>)DataContext
    from key in dict.Keys
    select key
  ).Distinct();

  gridView.Columns.ReplaceWith(
    from key in distinctKeys
    orderby key
    select new GridViewColumn
    {
      Header = key,
      DisplayMemberBinding = new Binding("[" + key + "]"),
    });
}

// The above code uses an extension method like this
static void ReplaceWith<T>(this ObserableCollection<T> collection, IEnumerable<T> newItems)
{
  collection.Clear();
  foreach(var item in newItems)
    collection.Add(item);
}

Это будет работать, если ключ вашего словаря не содержит специальных символов. Ключом к этой работе является синтаксис indxer в пути привязки ('[' и ']').

0 голосов
/ 04 марта 2010

Здесь вам нужно, чтобы ObservableDictionary работал как ObservableCollection, Проверьте эту тему, чтобы увидеть некоторые советы http://social.msdn.microsoft.com/forums/en-US/wpf/thread/af80921b-8bf0-4763-bd30-1e01dfc6f132/

Вот вам ответ - http://drwpf.com/blog/2007/09/16/can-i-bind-my-itemscontrol-to-a-dictionary/

Я думаю, что создание элементов UIE в коде и динамическое добавление в VisualTree вовсе не лучшая идея. Попробуйте использовать связывание данных с ObservableDictionary, который внутренне создает ваши таблицы данных GridView и будет поддерживать ваш ListView в правильном порядке столбцов.

Избегайте gridview.Columns.Add (gridViewColumn); в петле. В нем четко создаются столбцы, равные количеству строк. Конечно, я не понимаю вашу схему DynamicDictionary ..

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