2015-05-25 3 views
0

Я пытаюсь связать список типов типа User в сетку данных с 2 столбцами.Связывание данных списка со сложными элементами

Класс пользователя:

public class User 
    { 

     private string username; 
     private string password; 
     private Object person; 

     public User(string _username, string _password, Object _person=null) 
     { 
      username = _username; 
      password = _password; 
       person = _person; 
     } 

     public string UserName 
     { 
      get { return username; } 
      set { username = value; } 
     } 
     public string Password 
     { 
      get { return password; } 
      set { password = value; } 
     } 
     public Object Person 
     { 
      get { return person; } 
      set { person = value; } 
     } 

main.xaml:

<DataGrid Name="UserGrid" ItemsSource="{Binding}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="User name" Binding="{Binding UserName}"/> 
      <DataGridTextColumn Header="Person" Binding="{Binding Person}"/> 
     </DataGrid.Columns> 
</DataGrid> 

main.xaml.cs

UserGrid.DataContext = listOfUsers; 

Этот код работает отлично! связывает список пользователей с DataGrid. Теперь отображается значение имени пользователя и значения лица.

Но я хочу показать внутренняя недвижимостьОбъект человека. Предположим, что объект, который называется человеком, имеет тип Пища и имеет свойство под названием вкус.

Как сделать DataGrid отображаемым значением имени пользователя и значением Person.taste?

+3

Вы ответили на свой вопрос: '{Binding Person.taste}', но это должно быть ** публичное имущество **. Вы попробовали? – dkozl

+0

Добро пожаловать в переполнение стека! В отличие от форумов, мы не используем «Спасибо», или «Любая помощь оценена», или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -Удалена-от-сообщений). –

ответ

0

В зависимости от того, как вы хотите, чтобы отобразить данные, вот несколько различных вещей, которые вы можете сделать (это не исчерпывающий список):

  1. Bind к Person.Food.taste непосредственно.
  2. Добавить ToString() переопределить класс Person и вернуть строку так, как вы хотите ее отобразить. Вы не сможете редактировать его таким образом, не выполняя дополнительную работу, но не уверен, что это требование является требованием.
  3. Используйте DataGridTemplateColumn, чтобы представить данные любым удобным вам способом (и, при необходимости, отредактировать свое собственное редактирование). Например:

    <DataGridTemplateColumn 
        Header="Person"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate 
          DataType="{x:Type local:User}"> 
          <!-- Put any template you want here --> 
          <TextBlock Text="{Binding Person.Food.taste}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
    

Edit: На основе вашего наблюдения, если вы хотите иметь дисплей колонки различных данных для различных типов объектов, то вам нужно будет воспользоваться DataGridTemplateColumn я уже говорил, установка до DataTemplate для каждого типа данных и создать селектор шаблонов, чтобы выбрать правильный. Итак, ваша колонка будет выглядеть примерно так:

<DataGridTemplateColumn Header="Rank"> 
    <DataGridTemplateColumn.CellTemplateSelector> 
     <local:RankTemplateSelector> 
      <local:RankTemplateSelector.EmployeeTemplate> 
       <DataTemplate DataType="{x:Type local:Employee}"> 
        <TextBlock Text="{Binding Rank}" /> 
       </DataTemplate> 
      </local:RankTemplateSelector.EmployeeTemplate> 
      <local:RankTemplateSelector.CustomerTemplate> 
       <DataTemplate DataType="{x:Type local:Customer}"> 
        <TextBlock Text="N/A" /> 
       </DataTemplate> 
      </local:RankTemplateSelector.CustomerTemplate> 
      <local:RankTemplateSelector.ClubMemberTemplate> 
       <DataTemplate DataType="{x:Type local:ClubMember}"> 
        <TextBlock Text="N/A" /> 
       </DataTemplate> 
      </local:RankTemplateSelector.ClubMemberTemplate> 
     </local:RankTemplateSelector> 
    </DataGridTemplateColumn.CellTemplateSelector> 
</DataGridTemplateColumn> 

И ваш селектор шаблона будет выглядеть следующим образом:

class RankTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate EmployeeTemplate { get; set; } 
    public DataTemplate CustomerTemplate { get; set; } 
    public DataTemplate ClubMemberTemplate { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     if (item == null) return null; 
     if (item is Employee) return EmployeeTemplate; 
     if (item is Customer) return CustomerTemplate; 
     if (item is ClubMember) return ClubMemberTemplate; 
     throw new ArgumentException("The type of the item is not recognized", "item"); 
    } 
} 
Смежные вопросы