我有一个模型类Person和一个UserControl PersonComboBoxItem来显示它。
我想做的是,创建一个ComboBox
,其ItemsSource绑定到名为People的ObservableCollection<Person>
并使用我的PersonUserControl来显示集合中的每个Person。
<Grid>
<ComboBox SelectedIndex="0" ItemsSource="{Binding People}" >
<ComboBox.ItemTemplate>
<DataTemplate>
<local:PersonComboBoxItem Person="{Binding ###how do I get the current item here to set the property 'Person' on my PersonComboBoxItem class? ### }" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
我已经按照great article about databinding on msdn的方式工作了,但我无法过渡到我的设计方法。 随意批评它 - 我不确定,如果这是WPF方式的话。
问候,弗洛里安
P.S。:我的示例代码可以从here下载。
答案 0 :(得分:2)
只需使用隐式DataTemplate
告诉WPF如何在可视树中遇到它时绘制Person
对象
<Grid>
<ComboBox SelectedIndex="0" ItemsSource="{Binding People}" DisplayMemberPath="Name">
<ComboBox.Resources>
<DataTemplate DataType="{x:Type local:Person}">
<local:PersonComboBoxItem />
</DataTemplate>
</ComboBox.Resources>
</ComboBox>
</Grid>
ComboBox
已将Person
数据对象放在VisualTree
中,可能看起来像这样:
<StackPanel>
<ContentPresenter>
<Person />
</ContentPresenter>
<ContentPresenter>
<Person />
</ContentPresenter>
<ContentPresenter>
<Person />
</ContentPresenter>
...
</StackPanel>
因此,您只需使用<Person />
替换<local:PersonComboBoxItem />
所在的位置。 DataContext
的{{1}}也将设置为UserControl
个对象
此外,Person
的{{1}}将始终为DataContext
类型,因此您甚至不需要PersonItemComboBox
依赖项属性。
答案 1 :(得分:2)
DataContext
中的ItemTemplate
是当前Person
,直接绑定到DataContext
,因此Person
只使用{Binding}
}。
您可以将UserControl
设计为直接使用当前DataContext
而不是Person
属性,然后您无需明确设置任何内容。