XAML重写ToString

时间:2013-09-02 16:51:14

标签: c# sqlite xaml

我的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();

现在最初我的listview(测试)非常通用的文字:

  

win8.Model.databaseTables +人

但是当我将以下内容添加到我的模型中时:

        public override string ToString()
        {
            return string.Format("{0} - {1} : {2} -- {3}", personName, personEmail, personPhone, personDOB);
        }

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

我的问题是为什么我需要override ToString方法?

1 个答案:

答案 0 :(得分:3)

因为这是WPF的正常行为,如果/当您没有指定数据绑定对象(在您的情况下为Person的实例)应如何格式化/显示时。有多种方法可以解决此问题,其中一种方法可能是为DisplayMemberPath指定ListView的值。因此,例如,如果您不想覆盖ToString(),那么您可以在Person类中创建一个成员属性,该属性返回所需的字符串并将其指定为DisplayMemberPath。 / p>

有摘要的人

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)选项......

或者,您可以在DataTemplate中使用自定义ListView并指定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>