我如何编辑“ComboBoxItem”?

时间:2016-12-20 09:59:03

标签: c# wpf mvvm combobox

我的项目中有以下ComboBox,但有一点让我非常困扰,如果我这样写的话:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="170" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Label Content="Candidate" Margin="3" Foreground="White" Grid.Column="0"/>
    <ComboBox ItemsSource="{Binding CandidateList, UpdateSourceTrigger=PropertyChanged}" 
              SelectedItem="{Binding Candidate, UpdateSourceTrigger=PropertyChanged}"
              IsEditable="True" Margin="3" Grid.Column="1">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock>
                    <TextBlock.Text>
                        <MultiBinding StringFormat="{}{0} {1}">
                            <Binding Path="FirstName"/>
                            <Binding Path="SecondName"/>
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
</Grid>

因此,展开版本中的名称格式正确,但在ComboBox本身显示它不正确...

是否有可能在xaml中完成这项工作?

2 个答案:

答案 0 :(得分:2)

之前已经问过这个问题。

WPF IsEditable=true ComboBox filled with objects displays the ToString() as the selected item

WPF Combobox: Different template in textbox and drop-downlist

您可以向数据对象添加一个属性,该属性返回全名,并将ComboBox的TextSearch.TextPath属性设置为此属性,或尝试修改ComboBoxItem容器的ControlTemplate。请查看以上链接以获取更多信息。

答案 1 :(得分:0)

只是一个想法,但你可以解决这个问题,并且当你想要显示它时,通过添加一个带有getter的DisplayName属性(需要将OnPropertyChanged(“DisplayName”)添加到你的First /中)来消除对未来转换器的需求第二个名称设置者),或通过覆盖候选类的ToString()方法。基本上 -

Override ToString()
{
    return FirstName + " " + SecondName ;
}

实际上我不确定如果更改值,OnPropertyChanged是否会触发它:/