为什么显示类名而不是属性?

时间:2015-06-02 18:45:47

标签: wpf

我在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}"/>

以及以下类和绑定代码

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

...

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

当我运行它时会显示类名而不是Name属性的内容,我做错了什么?

5 个答案:

答案 0 :(得分:2)

我想您忘了使用它:DisplayMemberPath="Tag"或“名称”无论您希望展示什么!

答案 1 :(得分:1)

您需要在ComboBox XAML中设置DisplayMemberPath。

这不是一个绑定,因为ItemsSource已被绑定 - 你只需引用字段名称,如下所示:

<ComboBox DisplayMemberPath="Name" ...

答案 2 :(得分:0)

另见答案: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是商品的来源。你的装订毫无意义。你想给它一个CharacterEntity的列表,但你绑定到CharacterEntity类?你在说什么名单?并且不要在代码中设置它。如果使用viewmodel,XAML会更有意义。

现在,不管怎样,上面的MyViewModel类需要成为拥有ComboBox的某个控件的DataContext

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

答案 3 :(得分:0)

在XAML中,您将ItemsSource设置为CharacterEntity类而不是List<CharacterEntity>,因为您在代码隐藏中设置Itemssource将其从XAML中删除并尝试。此外,您需要设置DisplayMemberPath="Name"并设置SelectedItemSelectedValue,如果您使用的是SelectedValue,请同时使用SelectedValuePath="Name"

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

答案 4 :(得分:0)

如果你有这样的话:

SelectedItem="{Binding Path=Name}"

它将使用现在在combobox中选择的内容,Name的类属性被用作Selected。如果没有Path,则绑定到该组合框Name对象。但无论如何,这在你的情况下还不适用于Path。因此,要让它按照您的意愿运行,请尝试以下方法:

将SelectedItem绑定到CharacterEntity类:

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

然后你有一个绑定到Name的所选实体类属性的文本:

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

这样它应该有效。你应该有一个绑定到viewmodel的组合框,并且viewmodel应该有SelectedEntity的属性(CharacterEntity的类实例)。希望这会有所帮助:

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

和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}"/>

还有代码隐藏,例如构造函数:

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

我解释这个很糟糕,但我希望我的代码能够理解。