Gus*_*nti 7 data-binding wpf combobox
我需要完成的是一个显示People的ComboBox.当您展开下拉列表时,它会显示FirstName和LastName,但是当您选择一个人时,组合框中显示的值应该只是该人的名字.
我有以下ItemTemplate:
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding LastName}" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)
当选择一个项目时,我还应该做什么才能显示第一个名字?
谢谢!
稍微改变了一个问题:如果我有人的照片而不是在选择一个人时只显示第一个名字怎么办,我只想显示照片.换句话说,我怎样才能有两个单独的模板 - 一个用于下拉列表,另一个用于所选项目?
Ole*_*lik 18
这是解决方案:
<ComboBox>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<ContentControl x:Name="content" Content="{Binding}" ContentTemplate="{StaticResource ComplexTemplate}"/>
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ComboBoxItem}}" Value="{x:Null}">
<Setter TargetName="content" Property="ContentTemplate" Value="{StaticResource SimpleTemplate}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
基本上,您在此处再创建一层DataTemplate.ComboBox'es ItemTemplate始终保持不变.但该模板中的内容会根据您感兴趣的条件进行调整.
将下拉组合项与选区组合框项区分开的技巧是,选择区域实际上并未包含在ComboBoxItem对象中,它是ComboBox控件本身的一部分.因此,ComboBoxItem的FindAncestor返回null,我们在上面的触发器中使用它.
我知道了.我只需要将以下内容添加到我的ComboBox:
IsEditable="True" IsReadOnly="True" TextSearch.TextPath="FirstName"
Run Code Online (Sandbox Code Playgroud)
在DataTemplate上放置一个触发器.触发器应检查IsSelected属性(DataTemplate将需要为此设置TargetType).如果选中它,则可以将TextBlocks的可见性设置为折叠,并将图像的可见性设置为可见.然后针对未选择的情况执行相反的操作.