ComboBox.SelectedValue returns ToString() 而不是名称 属性

ComboBox.SelectedValue returns ToString() instead of the Name property

我正在尝试创建一个 ComboBox,其中 drop-down 列表显示活动元素的名称和描述([=77 的属性 NombreCampanaDescripcion =] 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}&#x0a;{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.

之后我将 ComboBoxItemSource 设置为 NombresObservableCollection)。

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?

中得到了答案

无论项目是否被选中,两个模板之间的简单交换。