0

私の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方法を取らなければならなかったのですか?

4

1 に答える 1

3

Personこれは、データバインドされたオブジェクト (この場合は のインスタンス) をフォーマット/表示する方法を指定していない場合の WPF の通常の動作であるためです。これに対処するには複数の方法がありDisplayMemberPathますListView。たとえば、オーバーライドしたくない場合は、目的の文字列を返すToString()メンバー プロパティをクラスに作成し、 .PersonDisplayMemberPath

要約を持つ人

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>
于 2013-09-02T17:24:37.920 に答える