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

然后我从表中得到了实际值。

我的问题是,为什么我必须使用overrideToString方法?

XAML Overriding 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>