我有一个列表框,我想显示一个对象列表,我遵循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
答案 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)
您的列表不应包含UI-Elements而应包含数据(您是数据 -binding),如果您绑定到ListBoxItems
ListBox
列表将ItemTemplate
忽略ListBox
并只使用符合readonly
预期容器的项目。容器将自动生成,您无需在列表中执行此操作。
如果您在运行时向集合添加项目,则需要通知绑定引擎更新更改,为此您应使用ObservableCollection
或实现INotifyCollectionChanged
的任何内容。 (这样做时你通常会进行字段{{1}}而只提供一个吸气剂)这就是为什么没有物品的原因。