RollRoll
RollRoll

Reputation: 8472

why is it displaying class name instead of property?

I have the following combobox in the xaml:

    <ComboBox x:Name="cmbCharacters1" HorizontalAlignment="Left" Margin="18,21,0,0" VerticalAlignment="Top" Width="136" SelectedIndex="0" Height="32" RenderTransformOrigin="1.53,-1.281"
              ItemsSource="{Binding CharacterEntity}" SelectedItem="{Binding Name}" SelectedValue="{Binding Tag}"/>

and the following class and binding code

public class CharacterEntity
{
    public string Name { get; set; }
    public string Tag { get; set; }
}

....

cmbCharacters1.ItemsSource = characters;//it is a List<CharacterEntity>

when I run it displays the class name instead of the content of Name property, what am I doing wrong?

Upvotes: 2

Views: 4032

Answers (5)

Jon Koivula
Jon Koivula

Reputation: 947

When you have it like this:

SelectedItem="{Binding Path=Name}"

it will use what ever is now selected in combobox, that class property of Name is being used as Selected. Without Path, you are binding to that combobox Name object. BUT anyways, this shouldn't yet work in your case with Path. So to have it work as you want it to, try this:

Have a SelectedItem binded to CharacterEntity class:

SelectedItem="{Binding SelectedEntity}" // Class instance of CharacterEntity

And then you have a Text binded to that selected entity class property of Name:

Text="{Binding Path=Name}" // Binded to property of Name
SelectedValue="{Binding Path=Tag}" // Binded to property of Tag

This way it should work. You should have a combobox binded to viewmodel and that viewmodel should have a property(class instance of CharacterEntity) of SelectedEntity. Hopefully this helps:

public class CharacterViewModel
{
    public CharacterEntity SelectedEntity {get;set;}
    public List<CharacterEntity> characters {get;set;} // use ObservableCollection insteand of List(Automatically update UI if list changes)
}

And XAML:

<ComboBox x:Name="cmbCharacters1" HorizontalAlignment="Left" Margin="18,21,0,0" VerticalAlignment="Top" Width="136" SelectedIndex="0" Height="32" RenderTransformOrigin="1.53,-1.281"
              ItemsSource="{Binding characters}" Text="{Binding Path=Name}" SelectedItem="{Binding SelectedEntity}" SelectedValue="{Binding Path=Tag}"/>

Also has in codebehind e.g in constructor:

CharacterViewModel charViewModel = new CharacterViewModel();
cmdCharacters1.DataContext = charViewModel;
cmdCharacters1.ItemsSource= charViewModel.characters;

I'm terrible at explaining this, but I hope it makes sense with my code.

Upvotes: 0

See also this answer: https://stackoverflow.com/a/3797074/424129

C#

public class CharacterEntity
{
    public string Name { get; set; }
    public string Tag { get; set; }
}

//  Look up how to implement INotifyPropertyChanged, I didn't bother here
public class MyViewModel : INotifyPropertyChanged {
    public MyViewModel(IEnumerable<CharacterEntity> chars)
    {
        CharacterEntities = new List<CharacterEntity>(chars);
    }
    private IEnumerable<CharacterEntity> _characterEntities;
    public IEnumerable<CharacterEntity> CharacterEntities {
        get { return _characterEntities; }
        set { _characterEntities = value; 
              OnPropertyChanged("CharacterEntities"); }
    }
    private CharacterEntity _characterEntity
    public CharacterEntity SelectedCharacterEntity
}

XAML

ItemsSource is the source for the items. Your binding made no sense. You want to give it a list of CharacterEntity, but you bind to the CharacterEntity class? What list are you talking about? And don't set it in code behind. XAML makes much more sense if you use a viewmodel.

Now, somehow the above MyViewModel class needs to be made the DataContext of some control that owns the ComboBox.

<ComboBox HorizontalAlignment="Left" Margin="18,21,0,0" 
    VerticalAlignment="Top" Width="136" SelectedIndex="0" Height="32" 
    RenderTransformOrigin="1.53,-1.281"
    ItemsSource="{Binding CharacterEntities}" 
    SelectedItem="{Binding SelectedCharacterEntity}"
    DisplayMemberPath="Name"
/>

Upvotes: 0

Ash
Ash

Reputation: 737

In the XAML you are setting the ItemsSource to a class CharacterEntity instead of List<CharacterEntity>, since you are setting the Itemssource in the code-behind remove it from the XAML and try. Also, you need to set DisplayMemberPath="Name" and set either SelectedItem or SelectedValue not both, if you are using SelectedValue then also use SelectedValuePath="Name"

<ComboBox x:Name="cmbCharacters1" SelectedItem="{Binding someCharacter}" DisplayMemberPath="Name" />

Upvotes: 1

James Harcourt
James Harcourt

Reputation: 6389

You need to set the DisplayMemberPath in your ComboBox XAML.

This isn't a binding, since the ItemsSource is already bound - you just reference the field name, like so:

<ComboBox DisplayMemberPath="Name" ...

Upvotes: 1

Dragos Stoica
Dragos Stoica

Reputation: 1935

I think you forgot to use this: DisplayMemberPath="Tag" Or "Name" whatever you wish to display!

Upvotes: 2

Related Questions