XAML Overriding ToString
本文关键字:ToString Overriding XAML | 更新日期: 2023-09-27 18:30:06
我的ViewModel 中有以下内容
public IEnumerable<win8Chores.Model.databaseTables.Person> selectAllPerson()
{
using (var db = new SQLiteConnection(dbPath))
{
return db.Query<win8Chores.Model.databaseTables.Person>("select personId,personName,personEmail,personDOB from Person");
//return db.Table<Person>();
}
}
我有一个型号:
public class Person
{
[PrimaryKey, AutoIncrement]
public int personId { get; set; }
[MaxLength(25)]
public string personName { get; set; }
[MaxLength(50)]
public string personEmail { get; set; }
[MaxLength(13)]
public string personPhone { get; set; }
public DateTime personDOB { get; set; }
public Boolean isPersonActive { get; set; }
}
在我看来,我有以下内容:
DataContext = VM;
test.ItemsSource = VM.selectAllPerson();
现在,最初我在我的列表视图(测试)中得到了非常通用的文本:
win8.模型.数据库表+个人
但当我在我的模型中添加以下内容时:
public override string ToString()
{
return string.Format("{0} - {1} : {2} -- {3}", personName, personEmail, personPhone, personDOB);
}
然后我从表中得到了实际值。
我的问题是,为什么我必须使用override
和ToString
方法?
因为如果/当您没有指定数据绑定对象(在您的案例中是Person
的实例)应该如何格式化/显示时,这是WPF的正常行为。有多种方法可以解决这个问题,其中之一可能是简单地将DisplayMemberPath
的值指定为ListView
。例如,如果您不想覆盖ToString()
,那么您可以在Person
类中创建一个成员属性,该属性返回所需的字符串,并将其指定为DisplayMemberPath
。
有摘要的人员
public class Person
{
public int personId { get; set; }
public string personName { get; set; }
public string personEmail { get; set; }
public string personPhone { get; set; }
public DateTime personDOB { get; set; }
public Boolean isPersonActive { get; set; }
public string Summary
{
get { return string.Format("{0} - {1} : {2} -- {3}", personName, personEmail, personPhone, personDOB); }
}
}
XAML
<ListView ... DisplayMemberPath="Summary"/>
另一个(纯XAML)选项
或者,您可以在ListView
中使用自定义DataTemplate
,并指定MultiBinding
来提供所需的聚合值。这种方法避免了在Person
类中引入新成员的需要。
<ListView ItemsSource="{Binding Items}">
<ListView.View>
<GridView>
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} - {1} : {2} -- {3}">
<Binding Path="personName" />
<Binding Path="personEmail" />
<Binding Path="personPhone" />
<Binding Path="personDOB" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>