如何设置ItemSource和ItemTemplate以显示对象列表

时间:2011-10-29 18:26:24

标签: wpf list data-binding mvvm itemtemplate

我有一个列表框,我想显示一个对象列表,我遵循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的属性,我希望将其显示为列表中的标签

*编辑 在我的窗口中,我得到一行文本 - mynamespace.MyObject

2 个答案:

答案 0 :(得分:1)

ViewModel中的MyList属性是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");
    }
}

答案 1 :(得分:1)

  1. 您的列表不应包含UI-Elements而应包含数据(您是数据 -binding),如果您绑定到ListBoxItems ListBox列表将ItemTemplate忽略ListBox并只使用符合readonly预期容器的项目。容器将自动生成,您无需在列表中执行此操作。

  2. 如果您在运行时向集合添加项目,则需要通知绑定引擎更新更改,为此您应使用ObservableCollection或实现INotifyCollectionChanged的任何内容。 (这样做时你通常会进行字段{{1}}而只提供一个吸气剂)这就是为什么没有物品的原因。