2013-09-30 3 views
0

Предположим, что вы пишете код для класса Person, свойства которого состоят из примитивных типов и класса Address, свойства которого являются примитивными типами. Вы помещаете несколько объектов Person в ObservableCollection, и вы хотите привязать их к DataGrid. Свойства с примитивными типами будут отображаться нормально, но свойство Address, то есть класс, состоящий из примитивных типов, просто отобразит «(Коллекция)».Как привязать DataGrid к свойству второго уровня источника данных?

Я нашел solution этой проблеме во время поиска в Интернете, но, похоже, много работы для небольшой функциональности. Решение, которое я нашел, было для 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;} 
    } 
} 
+0

Как вы хотите Адрес для отображения? PostCode и City в столбце каждая или пользовательская ячейка для хранения обоих? –

+0

В каждой колонке. – TheKobra

ответ

2
<DataGrid> 
    <DataGrid.Columns> 
    <DataGridTextColumn Binding="{Binding Id}"/> 
    <DataGridTextColumn Binding="{Binding Name}"/> 
    <DataGridTextColumn Binding="{Binding HomeAddr.CityName}"/> 
    <DataGridTextColumn Binding="{Binding HomeAddr.PostCode}"/> 
    </DataGrid.Columns> 
</DataGrid> 
+0

Я вижу сейчас, хороший ответ. – paqogomez

0

Причина, почему вы не можете добавить адрес непосредственно в столбце DataGrid потому, что столбец ожидает примитивный тип и вы посылаете «Адрес» типа. Чтобы исправить это, вы должны создать конвертер, который преобразует ваш объект Address в примитивный тип, например строку.

Сначала добавьте ваш конвертер в Resource Dictionary

<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

Смежные вопросы