Связь данных WPF ListView не является обязательной!

Простой WPF ListView:

<ListView Name="recordContainer" ItemsSource="{Binding Path=MyCollection}">
   <GridView>
      <GridViewColumn Width="260" Header="Name" DisplayMemberBinding="{Binding Path=Name}"/>
      <GridViewColumn Width="100" Header="Value" DisplayMemberBinding="{Binding Path=Value}"/>
   </GridView>
</ListView>

MyCollection - это свойство на моей странице:

public ObservableCollection<MyData> MyCollection
{
  get
  {
     return myCollection;
  }
}

и это мой объект данных:

public class MyData
{
    public string Name { get; set; }
    public string Value { get; set; }
}

Я заполняю myCollection в конструкторе страницы (перед InitializeComponent), но список становится пустым!

У меня точно такая же конфигурация на других страницах, и она отлично работает - что мне не хватает?

Любая помощь приветствуется!


person JohnIdol    schedule 18.08.2009    source источник


Ответы (4)


Установите DataContext страницы на саму страницу:

this.DataContext = this;
person Thomas Levesque    schedule 18.08.2009
comment
Спасибо, это работает! не ясно, почему это работает на других страницах, где я явно не делаю этого - person JohnIdol; 18.08.2009

Что сказал Томас ... или ...

Вам не хватает того, что привязка фактически проверяет DataContext. Однако вы можете настроить источник по-разному несколькими способами.

Подумайте об этом так ... Где привязка для поиска MyCollection? Связывание - это просто класс; это еще не все. Вы должны сказать, где искать. По умолчанию это DataContext. DataContext является общим для элементов логического дерева вашего пользовательского интерфейса, при этом элементы, расположенные ниже в дереве, могут видеть DataContexts выше в дереве или даже переопределять это значение для элементов ниже, чем они сами.

В вашем случае вы хотите, чтобы на вашей странице находилось значение, которое не является DataContext. Вы должны сообщить Binding, как это найти. Вы можете сделать это через свойство RelativeSource.

{Binding MyCollection RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Page}}}

Это комбинация трех помощников разметки: Binding, RelativeSource и Type.

RelativeSource находит объект в дереве относительно текущей позиции. В этом случае мы ищем предка (ищем по дереву). RelativeSource просматривает дерево в поисках первого объекта типа Page. Как только он обнаруживает это, он возвращает его в Привязку. Привязка затем проверяет этот объект на наличие свойства MyCollection.

person Community    schedule 18.08.2009
comment
Плюс один к вам. Будет .. Просто неправильно использовать this.DataContext = this .. Какой смысл иметь модель просмотра, если вы собираетесь использовать свой элемент управления в качестве модели просмотра .. - person Arcturus; 19.08.2009

Здесь: http://simplesample.site90.com/wpf_binded_listview.php

представляет собой полный пример, показывающий ListView, привязанный к ObservableCollections, и манипулирование ими с помощью команд.

Надеюсь это поможет.

person Rafa    schedule 01.09.2010
comment
Большое спасибо за этот действительно полезный пример! - person Cris; 27.06.2011

Я считаю, что проблема в том, что listview принимает в качестве контейнера что-то вроде gridview. Вот как просмотр списка позволяет нелинейное расположение элементов, в отличие от списка.

Подумайте об этом как

     ListView = Layout Coordinator

         GridView = Layout Style

               Elements = Items to be displayed

Если вы не собираетесь отображать свои элементы каким-либо иным образом, кроме списка, используйте ListBox.

(p.s. выделение без учета)

person userFog    schedule 16.09.2015