使用DataTemplate显示ComboBox的选定项错误?

时间:2011-07-31 21:09:57

标签: c# wpf data-binding combobox datatemplate

我的ComboBox有问题。打开ComboBox时显示项目。当我选择一个项目并且ComboBox正在关闭时,ComboBox显示Model.Person而不是Name, Vorname

  1. 我该如何解决?
  2. 如何实现自动建议?
  3. 我有一个带有DataTamplate的ComboBox。

    <ComboBox ItemTemplate="{StaticResource PersonenComboboxTemplate}"
     x:Name="Person1CheckboxName" Text="Choose Person" IsEditable="True"
     ItemsSource="{Binding Path=Personenliste}"
     SelectionChanged="Person1CheckboxName_SelectionChanged" />
    
    <DataTemplate x:Key="PersonenComboboxTemplate">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Path=Name}"/>
            <TextBlock Text=", "/>
            <TextBlock Text="{Binding Path=Vorname}"/>
        </StackPanel>
    </DataTemplate>
    

    我使用MVVM-Pattern。数据绑定在ViewModel中实现。

    public ObservableCollection<Person> Personenliste
        {
            get
            {
                ObservableCollection<Person> persColl = 
                                                  new ObservableCollection<Person>();
                List<Person> personen = 
                              databaseConnection.getAllPersonsRAW().ToList<Person>();
                // sort by Vorname and Nachname
                personen.Sort(new PersonComparer());
                foreach (Person p in personen)
                {
                    persColl.Add(p);
                }
                return persColl;
            }
        }
    

    Person具有给定名称(Vorname)和姓氏(Name)。 (由ADO.NET实体数据模型生成)

    [EdmEntityTypeAttribute(NamespaceName="dataModel", Name="Person")]
    [Serializable()]
    [DataContractAttribute(IsReference=true)]
    public partial class Person : EntityObject
    {
        #region Factory-Methode
    
        /// <summary>
        /// Erstellt ein neues Person-Objekt.
        /// </summary>
        /// <param name="personID">Anfangswert der Eigenschaft PersonID.</param>
        public static Person CreatePerson(global::System.Int64 personID)
        {
            Person person = new Person();
            person.PersonID = personID;
            return person;
        }
    
        #endregion
        ...
        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String Name
        {
            get
            {
                return _Name;
            }
            set
            {
                OnNameChanging(value);
                ReportPropertyChanging("Name");
                _Name = StructuralObject.SetValidValue(value, true);
                ReportPropertyChanged("Name");
                OnNameChanged();
            }
        }
        ...
    }
    

1 个答案:

答案 0 :(得分:0)

在Person类(或部分类)中重写ToString()以返回Name + " " + Vorname

public partial class Person
{
    public override ToString()
    {
        return string.Format("{0} {1}", Name, Vorname);
    }
}

修改

由于ToString()不会对更改通知做出反应,因为H.B。在评论中指出,你可以使用第二种方法:

// In PersonPartial.cs
public partial class Person
{
    public string DisplayText
    {
        get { return string.Format("{0} {1}", Name, Vorname); }
    }

    partial void OnNameChanged()
    {
        OnPropertyChanged("DisplayText");
    }

    partial void OnVornameChanged()
    {
        OnPropertyChanged("DisplayText");
    }
}
<ComboBox ... DisplayMemberPath="DisplayText" />