使用ItemsSource和ItemTemplate的WPF ListBox
当我在WPF ListBox
同时拥有ItemsSource
和ItemTemplate
时,我对如何解析绑定感到困惑。
我有一个名为ListOfIndexes
的ObservableCollection
。 对于每个索引,我想在数据库表中查找其记录。 我希望在IndexToObjectDescriptionConverter
这样做。
但转换器中的断点告诉我, ItemTemplate
绑定读取的值是窗口本身 – 即ItemsSource
和ItemsTemplate
的DataContext
是相同的。
请原谅一点坦率,但这似乎是DUMB。 ItemTemplate
的整个点是渲染ItemsSource
每个元素,所以我想我认为ItemTemplate
的DataContext
将是正在渲染的单个元素。
那就是说,我怎么告诉ItemTemplate
它应该担心ItemsSource
表示的各个元素而不是使用整个窗口的DataContext
?
您需要为ItemTemplate使用数据模板。 然后将其应用于列表中的每个项目
MSDN文档在这里: http : //msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemtemplate( v=vs.110) .aspx
问题是关于数据上下文的范围。 当您绑定ListBox上的任何属性时,它将使用ListBox的数据上下文 – 因此将数据上下文传递给转换器的原因。 如果在ItemTemplate中设置数据模板,它会将该模板应用于列表中的每个项目。 我想根据您提供的简单代码,您需要在数据模板中包含转换器:
在这种情况下,将为每个项目呈现ContentControl,并将该项目作为其数据上下文。
首先,我建议您仔细阅读MSDN中的“ 数据模板概述”页面,以便更好地了解此数据绑定过程。
我想在数据库表中查找其记录。 我希望在IndexToObjectDescriptionConverter中这样做。
那是你的第一个错误。 IValueConverter
负责转换数据绑定值, 而不是访问数据库。 在视图模型中访问您的数据,并使用结果填充公共属性。 然后数据将这些属性绑定到XAML中的UI控件。
请原谅一点坦率,但这似乎是DUMB
只对那些不了解情况的人。
我如何告诉ItemTemplate它应该担心ItemsSource表示的各个元素而不是使用整个窗口的DataContext?
你没有说什么……只需定义正确的XAML就足够了:
在Resources
:
在XAML中:
而已。