繁体   English   中英

XAML覆盖ToString

[英]XAML Overriding ToString

我的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.Model.databaseTables + Person

但是,当我在模型中添加以下内容时:

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

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

我的问题是为什么我必须override ToString方法?

因为这是WPF的正常行为,如果/未指定如何格式化/显示数据绑定对象(在您的情况下为Person的实例)时,这是WPF的正常行为。 有多种解决方法,其中一种可能是简单地为ListView DisplayMemberPath指定一个值。 因此,例如,如果您不想覆盖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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM