我在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属性的内容,我做错了什么?
答案 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"
并设置SelectedItem
或SelectedValue
,如果您使用的是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;
我解释这个很糟糕,但我希望我的代码能够理解。