簡體   English   中英

如何將DataGrid綁定到數據源的第二級屬性?

[英]How to bind DataGrid to a second-level property of a data source?

假設您為一個類Person編寫代碼,該類Person的屬性由原始類型組成, 一個Address類則所有屬性都是原始類型。 您將多個Person對象放入ObservableCollection並且想要將其綁定到DataGrid。 具有基本類型的屬性將正常顯示,但是由基本類型組成的類的屬性Address將僅顯示“(Collection)”。

谷歌搜索時,我找到了解決該問題的方法,但是對於一些功能而言,這似乎需要大量工作。 我找到的解決方案是針對DataGridView ,它的日期是2007年。現在有沒有更簡單的方法可以使用WPF和DataGrid還是一樣困難?

示例代碼:

class Person
{
    private string id;
    private string name;
    private Address homeAddr;

    public string ID
    {
            get { return id;}
            set { id = value;}
    }

    public string Name
    {
            get { return name;}
            set { name = value;}
    }

    public Address HomeAddr
    {
            get { return homeAddr;}
            set { homeAddr = value;}
    }
}

class Address
{
    private string cityname;
    private string postcode;

    public string CityName
    {
        get { return cityname;}
        set { cityname = value;}
    }

    public string PostCode
    {
        get { return postcode;}
        set { postcode = value;}
    }
}
<DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Id}"/>
    <DataGridTextColumn Binding="{Binding Name}"/>
    <DataGridTextColumn Binding="{Binding HomeAddr.CityName}"/>
    <DataGridTextColumn Binding="{Binding HomeAddr.PostCode}"/>
  </DataGrid.Columns>
</DataGrid>

無法將Address直接添加到DataGrid列的原因是因為該列需要原始類型,並且您發送了“ Address”類型對象。 要解決此問題,您必須創建一個Converter,將您的Address對象轉換為原始類型,例如字符串。

首先在資源字典中添加轉換器

<src:AddressToStringConverter x:Key="AddressToStringConverter" />

然后在您的網格中使用它

<DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Id }"/>
    <DataGridTextColumn Binding="{Binding Name}"/>
    <DataGridTextColumn Binding="{Binding HomeAddr, Converter={StaticResource AddressToStringConverter}}"/>
  </DataGrid.Columns>
</DataGrid>

在這里,您可以找到有關轉換器的更多信息: http : //wpftutorial.net/ValueConverters.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM