1

我有一个模型类 Person 和一个 UserControl PersonComboBoxItem 来显示它。

我想做的是,创建一个ComboBox它的 ItemsSource 绑定到我ObservableCollection<Person>调用的 People 的位置,并使用我的 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>

我已经完成了这篇关于 msdn 上的数据绑定的精彩文章,但我无法过渡到我的设计方法。随意批评它 - 我不确定,如果这是 WPF 方式来做到这一点。

问候,弗洛里安

PS:我的示例代码可以从这里下载。

4

2 回答 2

2

DataContextinItemTemplate是当前的,Person直接绑定到 theDataContext并因此绑定到Person刚才使用的{Binding}

您可以将您UserControl的设计直接使用当前DataContext而不是Person属性,然后您不需要显式设置任何内容。

于 2012-04-12T15:34:56.257 回答
2

只需使用隐式告诉 WPF在可视化树中遇到对象时DataTemplate如何绘制它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 />. 您的DataContextof 您UserControl也将设置为您的Person对象

此外,DataContextof thePersonItemComboBox将始终是 type Person,因此您甚至不需要Person依赖属性。

于 2012-04-12T15:34:20.673 回答