Как настроить ItemSource и ItemTemplate для отображения списка объектов - PullRequest
0 голосов
/ 29 октября 2011

У меня есть список, в котором я хочу отобразить список объектов, я следую шаблону MVVM и мне трудно добиться того, чего я хочу.

MainWindowView.xaml

<ListBox ItemsSource="{Binding Path=MyList}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Label Content="{Binding Path=Name}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

MainWindowViewModel.cs

    private List<ListBoxItem> _myList = new List<ListBoxItem>();

    public List<ListBoxItem> MyList
    {
        get { return _myList ; }
        set
        {
            _myList = value;
            OnPropertyChanged("MyList");
        }
    }

    public SprintBacklogViewModel()
    {
        foreach(MyObject obj in MyObjects.MyObjectList)
        {
            ListBoxItem item = new ListBoxItem();
            item.Content = obj;
            MyList.Add(item);
        }
    }

MyList корректно обновляется, но в окне ничего не отображается. (ItemsSource = "{Binding Path = MyList}" также работает, я тестировал на разных данных) Я не использовал ItemTemplate раньше, поэтому приветствуются любые указатели.Насколько я понимаю, если я настрою его правильно, он отобразит данные в моих объектах.Например:

<Label Content="{Binding Path=Name}"/>

в MyObject есть свойство с именем Name, я хочу отобразить его в виде метки в моем списке

* EDIT. В моем окне я получаю строку текста - mynamespace.MyObject

Ответы [ 2 ]

1 голос
/ 29 октября 2011
  1. Ваш список должен содержать не элементы пользовательского интерфейса, а данные (вы data -binding), если вы связываетесь со списком ListBoxItems, ListBox игнорирует ItemTemplate и просто используйте предметы, которые соответствуют ожидаемому контейнеру для ListBox. Контейнеры будут созданы автоматически, вам не нужно делать это в вашем списке.

  2. Если вы добавляете элементы в коллекцию во время выполнения, механизм привязки должен быть уведомлен об обновлении изменений, для этого вы должны использовать ObservableCollection или все, что реализует INotifyCollectionChanged. (При этом вы обычно делаете поле readonly и предоставляете только геттер) По этой причине нет элементов.

1 голос
/ 29 октября 2011

Свойство MyList в ViewModel является свойством типа ListBoxItem , оно имеет свойство Name , но не является именем MyObject. Таким образом, вам нужно изменить вашу собственность в вашей ViewModel на

Заменить

private List<ListBoxItem> _myList = new List<ListBoxItem>();

public List<ListBoxItem> MyList
{
    get { return _myList ; }
    set
    {
        _myList = value;
        OnPropertyChanged("MyList");
    }
}

с

private List<MyObject> _myList = new List<MyObject>();

public List<MyObject> MyList
{
    get { return _myList ; }
    set
    {
        _myList = value;
        OnPropertyChanged("MyList");
    }
}
...