【问题标题】:why is it displaying class name instead of property?为什么显示类名而不是属性?
【发布时间】:2015-06-02 18:45:47
【问题描述】:

我在 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 属性的内容,我做错了什么?

【问题讨论】:

    标签: wpf


    【解决方案1】:

    我想你忘了使用这个:DisplayMemberPath="Tag" 或“名称”任何你想显示的东西!

    【讨论】:

      【解决方案2】:

      您需要在 ComboBox XAML 中设置 DisplayMemberPath。

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

      <ComboBox DisplayMemberPath="Name" ...
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          另请参阅此答案: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 类?你在说什么清单?并且不要在后面的代码中设置它。如果您使用视图模型,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"
          />
          

          【讨论】:

            【解决方案5】:

            当你拥有它时:

            SelectedItem="{Binding Path=Name}"
            

            它将使用现在在组合框中选择的内容,Name 的类属性被用作 Selected。如果没有路径,您将绑定到该组合框名称对象。但是无论如何,这在您使用 Path 的情况下不应该起作用。所以要让它按你的意愿工作,试试这个:

            将 SelectedItem 绑定到 CharacterEntity 类:

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

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

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

            这样它应该可以工作。您应该有一个绑定到视图模型的组合框,并且该视图模型应该具有 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;
            

            我很难解释这一点,但我希望它对我的代码有意义。

            【讨论】:

            • 我不确定我是否记错了,但您可能应该使用 DisplayMemberPath 而不是 Text。
            猜你喜欢
            • 1970-01-01
            • 2011-09-08
            • 1970-01-01
            • 2021-07-23
            • 1970-01-01
            • 1970-01-01
            • 2015-03-31
            • 1970-01-01
            • 2011-11-21
            相关资源
            最近更新 更多