C# 使用DataTemplate时组合框的选定项显示错误?

C# 使用DataTemplate时组合框的选定项显示错误?,c#,wpf,data-binding,combobox,datatemplate,C#,Wpf,Data Binding,Combobox,Datatemplate,我对组合框有问题。当组合框打开时,将显示这些项目。当我选择一个项目并且组合框关闭时,组合框显示的是Model.Person,而不是Name,Vorname 我如何解决这个问题? 如何实现自动建议? 我有一个带有数据标签的组合框 我使用MVVM模式。数据绑定在ViewModel中实现 public ObservableCollection<Person> Personenliste { get { Observable

我对组合框有问题。当组合框打开时,将显示这些项目。当我选择一个项目并且组合框关闭时,组合框显示的是
Model.Person
,而不是
Name,Vorname

  • 我如何解决这个问题?
  • 如何实现自动建议?
  • 我有一个带有数据标签的组合框

    
    
    我使用MVVM模式。数据绑定在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类(或部分类)中的ToString()以返回
    Name+“”+Vorname

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

    正如H.B.在评论中指出的那样,由于ToString()不是对更改通知做出反应的东西,因此您可以使用第二种方法:

    // 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");
        }
    }
    
    
    
    Person类是如何声明的?由ADO.NET实体数据模型生成,并
    IsTextSearchEnabled=“True”
    解决第二个问题。:-)我是@H.B.这听起来像是资源范围问题w.r.t.
    StaticTemplate
    @H.B.为什么这是一个糟糕的黑客行为?OP说他使用MVVM,这意味着Person类是一个viewmodel,它的唯一目的是为视图进行数据绑定。因此,将ToString重写为有意义的内容是合乎逻辑的,它还可以避免重写控件模板的需要,而这正是OP所需要的。@BorisB:我认为,在任何情况下,重写
    ToString
    以实现应用程序逻辑中的某些内容都不是合乎逻辑的步骤。此外,如果任何属性发生更改,视图将不会更新,因为它甚至没有绑定,它只会执行一次一个本来不应该存在的方法。@H.B.我明白您关于使用ToString时没有后续更改通知的观点,我添加了一个替代答案。但我仍然不同意ToString是无用的它是为对象的字符串表示而设计的,在这里它是用于该目的的(表示,而不是“应用程序逻辑中的某个内容”),但您对绑定部分的理解是正确的。
    // 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");
        }
    }