ComboBox中的数据绑定:使用Usercontrol显示每个项目

时间:2012-04-12 15:28:48

标签: c# wpf xaml data-binding user-controls

我有一个模型类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下载。

2 个答案:

答案 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属性,然后您无需明确设置任何内容。