首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自动完成的WPF ComboBox SelectedItem

自动完成的WPF ComboBox SelectedItem
EN

Stack Overflow用户
提问于 2015-09-17 06:38:06
回答 1查看 1.9K关注 0票数 2

我正在ComboBox中实现一个自动完成,如下所示。自动完成系统工作得很好。我面临的唯一问题是,我希望将我的SelectedItems显示为ItemNumber[space]ItemDescription。目前,它只在我从自动完成中选择ItemNumber时才显示它。你们能修改一下下面的代码吗。

代码语言:javascript
运行
复制
class ItemDetails
{
    string _itemNumber;
    string _itemDescription;

    public string ItemNumber
    {
        get { return _itemNumber; }
        set { _itemNumber = value; }
    }
    public string ItemDescription
    {
        get { return _itemDescription; }
        set { _itemDescription = value; }
    }

    public ItemDetails() { }
    public ItemDetails(string itemNo, string description)
    {
        _itemNumber = itemNo;
        _itemDescription = description;
    }
}

填充材料

代码语言:javascript
运行
复制
    private void InitMaterial()
    {
        List<ItemDetails> items = new List<ItemDetails>();

        for (int i = 0; i <= 1000; i++)
        {
            items.Add(new ItemDetails(i.ToString(), "Item " + i.ToString()));
        }

        cbo1.ItemsSource = items;
    }

XAML

代码语言:javascript
运行
复制
<ComboBox x:Name="cboItemNoLegacy" HorizontalContentAlignment="Stretch"
      TextSearch.TextPath="MaterialNumberLegacy"
      ItemsSource="{Binding}" 
      IsSynchronizedWithCurrentItem="True"
      IsEditable="True"
      SelectedItem="{Binding LegacyItemNumber, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, Mode=TwoWay, Converter={StaticResource MaterialMasterConverter}}" 
      SelectionChanged="cboItemNoLegacy_SelectionChanged">
<ComboBox.ItemContainerStyle>
    <Style>
        <Setter Property="Control.Padding" Value="0"></Setter>
        <Style.Triggers>
            <Trigger Property="ComboBoxItem.IsSelected" Value="True">
                <Setter Property="ComboBoxItem.Background" Value="SkyBlue" />
            </Trigger>
        </Style.Triggers>
    </Style>
</ComboBox.ItemContainerStyle>
<ComboBox.ItemTemplate>
    <DataTemplate>
        <Grid Margin="0">
            <Border Margin="5" BorderThickness="0" BorderBrush="SteelBlue"
               CornerRadius="1">
                <Grid HorizontalAlignment="Left">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>

                    <TextBlock x:Name="tbSiteCode" FontWeight="Normal" Text="{Binding Path=ItemNumber}" Margin="0,0,7,0"></TextBlock>
                    <TextBlock Grid.Column="1" x:Name="tbSiteDesc" FontWeight="Normal" Text="{Binding Path=ItemDescription}" Margin="0,0,7,0"></TextBlock>
                </Grid>
            </Border>
        </Grid>
    </DataTemplate>
</ComboBox.ItemTemplate>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-17 08:36:36

当您在IsEditable=True上设置ComboBox属性时,选择区域中的选定项将不会呈现使用项的DataTemplate。在本例中,您将拥有一个TextBox控件。此TextBox控件只能显示一个字符串。

因此,您必须做的是为该TextBox提供一个属性,该属性具有希望显示在选择区域中的所需格式化字符串。您可以使用TextSearch.TextPath属性来指定Item对象中的哪些属性应视为TextBox和TextSearch功能的值。

使用聚合字符串值向ItemDetails类添加一个属性:

代码语言:javascript
运行
复制
public string AggregatedDescription
{
    get { return String.Format("{0} {1}", ItemNumber, ItemDescription);}
}

将此属性设置为ComboBox元素TextSearch.TextPath="AggregatedDescription"

另一个解决方案(我更喜欢这个解决方案)是重写ItemDetails .ToString()方法以获得所需的格式化值:

代码语言:javascript
运行
复制
public override string ToString()
{
    return String.Format("{0} {1}", ItemNumber, ItemDescription);
}

在这种情况下,您不应该指定TextSearch.TextPath属性。当未设置时,当前选定项的.ToString()值将用作TextSearch功能的字符串。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32623952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档