来自自动完成的 WPF ComboBox SelectedItem
WPF ComboBox SelectedItem from Autocomplete
我正在 ComboBox 中实现自动完成功能,如下所示。自动完成工作正常。我面临的唯一问题是,我希望我的 SelectedItems 显示为 ItemNumber[space]ItemDescription
。目前,它仅在我从自动完成中 select 时显示 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;
}
}
填充Material
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>
当您在 ComboBox 上设置 IsEditable=True
属性 时,选择区域中的选定项目将不会使用项目的 DataTemplate 呈现。在这种情况下,您将拥有一个 TextBox 控件。此 TextBox 控件只能显示一个字符串。
因此,您要做的是为该文本框提供一个 属性,其中包含您希望在选择区域中显示的所需格式化字符串。您可以使用 TextSearch.TextPath 属性 来指定 Item 对象中的 属性 应该被视为 TextBox 和 TextSearch 功能的值。
添加一个 属性 给你 ItemDetails
class 聚合字符串值:
public string AggregatedDescription
{
get { return String.Format("{0} {1}", ItemNumber, ItemDescription);}
}
将此 属性 设置为 ComboBox 元素 TextSearch.TextPath="AggregatedDescription"
另一个解决方案(我更喜欢这个)将只是重写 ItemDetails .ToString() 方法以获得所需的格式化值:
public override string ToString()
{
return String.Format("{0} {1}", ItemNumber, ItemDescription);
}
在这种情况下,您不应指定 TextSearch.TextPath
属性。未设置时,当前所选项目的 .ToString() 值将用作 TextSearch 功能的字符串。
我正在 ComboBox 中实现自动完成功能,如下所示。自动完成工作正常。我面临的唯一问题是,我希望我的 SelectedItems 显示为 ItemNumber[space]ItemDescription
。目前,它仅在我从自动完成中 select 时显示 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;
}
}
填充Material
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>
当您在 ComboBox 上设置 IsEditable=True
属性 时,选择区域中的选定项目将不会使用项目的 DataTemplate 呈现。在这种情况下,您将拥有一个 TextBox 控件。此 TextBox 控件只能显示一个字符串。
因此,您要做的是为该文本框提供一个 属性,其中包含您希望在选择区域中显示的所需格式化字符串。您可以使用 TextSearch.TextPath 属性 来指定 Item 对象中的 属性 应该被视为 TextBox 和 TextSearch 功能的值。
添加一个 属性 给你 ItemDetails
class 聚合字符串值:
public string AggregatedDescription
{
get { return String.Format("{0} {1}", ItemNumber, ItemDescription);}
}
将此 属性 设置为 ComboBox 元素 TextSearch.TextPath="AggregatedDescription"
另一个解决方案(我更喜欢这个)将只是重写 ItemDetails .ToString() 方法以获得所需的格式化值:
public override string ToString()
{
return String.Format("{0} {1}", ItemNumber, ItemDescription);
}
在这种情况下,您不应指定 TextSearch.TextPath
属性。未设置时,当前所选项目的 .ToString() 值将用作 TextSearch 功能的字符串。