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