ComboBox.SelectedValue returns ToString() 而不是名称 属性
ComboBox.SelectedValue returns ToString() instead of the Name property
我正在尝试创建一个 ComboBox
,其中 drop-down 列表显示活动元素的名称和描述([=77 的属性 NombreCampana
和 Descripcion
=] Campana
),当你 select 一个值时,它显示名称 (NombreCampana
)。我用 ObservableCollection
完成了此操作,因此更改会影响 ComboBox
而无需重新加载。
在主菜单 window (menuPrincipal
) 中,我有这个 XAML 用于 ComboBox
:
<ComboBox Style="{DynamicResource comboBoxCampaign}"
x:Name="campaignComboBox"
Text="{DynamicResource CampaignList}"
ItemsSource="{Binding Path=Nombres}"
SelectedValue="{Binding Path=NombreCampana, Mode=TwoWay}"
SelectedValuePath="Value"
SelectionChanged="CampaigneComboBox_SelectionChanged">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}
{1}">
<Binding Path="NombreCampana"/>
<Binding Path="Descripcion"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
ComboBox
链接到 code-behind 中的 ObservableCollection
:
private List<Campana> listacampana = new List<Campana>();
private ObservableCollection<Campana> nombres = new ObservableCollection<Campana>();
public ObservableCollection<Campana> Nombres
{
get { return nombres; }
set { nombres = value; }
}
public List<Campana> ListaCampanas
{
get { return listacampana; }
set { listacampana = value; }
}
public menuPrincipal()
{
InitializeComponent();
ConfiguracionPagina.DefinirIdioma(this, "MainMenu");
this.listacampana.AddRange(MainWindow.DatosUsuario.ListCampaigns);
foreach (Campana item in this.listacampana)
{
this.nombres.Add(item);
}
campaignComboBox.ItemsSource = this.nombres;
}
该代码定义语言、更改文本、将用户列表添加到 属性 列表,然后将所有项目 Campana
(广告系列)添加到 ObservableCollection
.
之后我将 ComboBox
的 ItemSource
设置为 Nombres
(ObservableCollection
)。
class Campana
是:
public class Campana
{
private string nombre;
private string descripcion;
private string imagen;
private List<RecursosCampana> listarecursos = new List<RecursosCampana>();
public string DireccionImagen
{
get { return imagen; }
set { imagen = value; }
}
public List<RecursosCampana> RecursosCampana
{
get { return listarecursos; }
set { listarecursos = value; }
}
public string Descripcion
{
get { return descripcion; }
set { descripcion = value; }
}
public string NombreCampana
{
get { return nombre; }
set { nombre = value; }
}
}
当我 运行 应用程序时,DataTemplate
工作正常并显示带有描述的项目。
但是当我 select 一件商品时,我得到了这个:
我已经尝试了通过搜索 Google 创建的所有内容,但我不明白发生了什么。另外,如果我没有在代码中定义 ItemSource
,XAML ItemSource
将不起作用。如果我注释掉 campaignComboBox.ItemsSource = this.nombres;
,就会发生这种情况:
编辑:回答评论,感谢@Keith Stein,我已经解决了部分问题,这就是风格
<Style x:Key="comboBoxCampaign" TargetType="ComboBox">
<Setter Property="Margin" Value="10"/>
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="IsEditable" Value="True"/>
<Setter Property="IsReadOnly" Value="True"/>
<Setter Property="Focusable" Value="True"/>
<Setter Property="FontSize" Value="15"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="Height" Value="Auto"/>
</Style>
我用它来制作 "placeholder" 文本,当您在组合框中单击后,初始文本就会消失,当我删除 "IsEditable" 时,我丢失了组合框仅有的初始标题要按的 V,但现在当我 select 一个项目时,我得到名称 + 描述。
这不是我想要的,我只是想显示名称,但更接近那个。
Edit2:数据绑定的问题是我没有使用 DataContext = this;现在我可以从 xaml 获取绑定,但我仍然不能只显示名称。
最后回答最后一条评论,我想做的是:
- 我正在做一个准备角色扮演冒险或场景的应用程序,在本节中用户 select 他将要使用的活动,所以我希望当他按下组合框时,他可以看到campaign 和 description 因为他可以有 2 个类似的 campaigns 或者基于同一个系统,一旦他选择了一个,如果他写了一个大描述,就显示更优雅的名字特别是
终于在这个postCan I use a different Template for the selected item in a WPF ComboBox than for the items in the dropdown part?
中得到了答案
无论项目是否被选中,两个模板之间的简单交换。
我正在尝试创建一个 ComboBox
,其中 drop-down 列表显示活动元素的名称和描述([=77 的属性 NombreCampana
和 Descripcion
=] Campana
),当你 select 一个值时,它显示名称 (NombreCampana
)。我用 ObservableCollection
完成了此操作,因此更改会影响 ComboBox
而无需重新加载。
在主菜单 window (menuPrincipal
) 中,我有这个 XAML 用于 ComboBox
:
<ComboBox Style="{DynamicResource comboBoxCampaign}"
x:Name="campaignComboBox"
Text="{DynamicResource CampaignList}"
ItemsSource="{Binding Path=Nombres}"
SelectedValue="{Binding Path=NombreCampana, Mode=TwoWay}"
SelectedValuePath="Value"
SelectionChanged="CampaigneComboBox_SelectionChanged">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}
{1}">
<Binding Path="NombreCampana"/>
<Binding Path="Descripcion"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
ComboBox
链接到 code-behind 中的 ObservableCollection
:
private List<Campana> listacampana = new List<Campana>();
private ObservableCollection<Campana> nombres = new ObservableCollection<Campana>();
public ObservableCollection<Campana> Nombres
{
get { return nombres; }
set { nombres = value; }
}
public List<Campana> ListaCampanas
{
get { return listacampana; }
set { listacampana = value; }
}
public menuPrincipal()
{
InitializeComponent();
ConfiguracionPagina.DefinirIdioma(this, "MainMenu");
this.listacampana.AddRange(MainWindow.DatosUsuario.ListCampaigns);
foreach (Campana item in this.listacampana)
{
this.nombres.Add(item);
}
campaignComboBox.ItemsSource = this.nombres;
}
该代码定义语言、更改文本、将用户列表添加到 属性 列表,然后将所有项目 Campana
(广告系列)添加到 ObservableCollection
.
之后我将 ComboBox
的 ItemSource
设置为 Nombres
(ObservableCollection
)。
class Campana
是:
public class Campana
{
private string nombre;
private string descripcion;
private string imagen;
private List<RecursosCampana> listarecursos = new List<RecursosCampana>();
public string DireccionImagen
{
get { return imagen; }
set { imagen = value; }
}
public List<RecursosCampana> RecursosCampana
{
get { return listarecursos; }
set { listarecursos = value; }
}
public string Descripcion
{
get { return descripcion; }
set { descripcion = value; }
}
public string NombreCampana
{
get { return nombre; }
set { nombre = value; }
}
}
当我 运行 应用程序时,DataTemplate
工作正常并显示带有描述的项目。
但是当我 select 一件商品时,我得到了这个:
我已经尝试了通过搜索 Google 创建的所有内容,但我不明白发生了什么。另外,如果我没有在代码中定义 ItemSource
,XAML ItemSource
将不起作用。如果我注释掉 campaignComboBox.ItemsSource = this.nombres;
,就会发生这种情况:
编辑:回答评论,感谢@Keith Stein,我已经解决了部分问题,这就是风格
<Style x:Key="comboBoxCampaign" TargetType="ComboBox">
<Setter Property="Margin" Value="10"/>
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="IsEditable" Value="True"/>
<Setter Property="IsReadOnly" Value="True"/>
<Setter Property="Focusable" Value="True"/>
<Setter Property="FontSize" Value="15"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="Height" Value="Auto"/>
</Style>
我用它来制作 "placeholder" 文本,当您在组合框中单击后,初始文本就会消失,当我删除 "IsEditable" 时,我丢失了组合框仅有的初始标题要按的 V,但现在当我 select 一个项目时,我得到名称 + 描述。
这不是我想要的,我只是想显示名称,但更接近那个。
Edit2:数据绑定的问题是我没有使用 DataContext = this;现在我可以从 xaml 获取绑定,但我仍然不能只显示名称。
最后回答最后一条评论,我想做的是: - 我正在做一个准备角色扮演冒险或场景的应用程序,在本节中用户 select 他将要使用的活动,所以我希望当他按下组合框时,他可以看到campaign 和 description 因为他可以有 2 个类似的 campaigns 或者基于同一个系统,一旦他选择了一个,如果他写了一个大描述,就显示更优雅的名字特别是
终于在这个postCan I use a different Template for the selected item in a WPF ComboBox than for the items in the dropdown part?
中得到了答案无论项目是否被选中,两个模板之间的简单交换。