【问题标题】:WPF ComboBox SelectedItem from Autocomplete来自自动完成的 WPF ComboBox SelectedItem
【发布时间】:2015-09-17 06:38:06
【问题描述】:

我在 ComboBox 中实现了一个自动完成功能,如下所示。自动完成工作正常。我面临的唯一问题是,我希望我的 SelectedItems 显示为ItemNumber[space]ItemDescription。目前,当我从自动完成中选择它时,它只显示 ItemNumber。你们可以修改下面的现有代码吗?

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;
    }
}

填充材质

    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

<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>

【问题讨论】:

  • 所以你有一个 ItemDetails 列表以某种方式 (ItemsSource="{Binding}") 绑定到 ComboBox 的 ItemsSource,MaterialNumberLegacy 和 MaterialDescription 属性来自哪里?在您的情况下,自动完成到底意味着什么?
  • @NovitchiS 我已经编辑了上面的代码,包括我如何填充组合框。我还更新了 XAML 以使用我使用的正确属性。那么,将在组合框中显示的文本将在自动完成功能中有所不同。当我在组合框中选择一个项目时删除组合框中的自动完成设置时,它会显示 ItemNumber 和 ItemDescription。但是,如果我的组合框中有自动完成设置,则只有 ItemNumber 会显示在组合框中。您可以查看我附上的上述图片以供参考。

标签: c# wpf data-binding wpf-controls mahapps.metro


【解决方案1】:

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

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

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

public string AggregatedDescription
{
    get { return String.Format("{0} {1}", ItemNumber, ItemDescription);}
}

将此属性设置为组合框元素TextSearch.TextPath="AggregatedDescription"

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

public override string ToString()
{
    return String.Format("{0} {1}", ItemNumber, ItemDescription);
}

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

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 2011-01-10
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 2012-06-19
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多