Привязка сложного типа в Silverlight Datagrid

Я создал сложный тип под названием «EmployeeName», используя конструктор Entity Framework в VS 2010. Имя сотрудника состоит из имени, фамилии и должности. Теперь вопрос: как отобразить/привязать к сетке данных в silverlight? Прямо сейчас он отображается в Datagrid как «Namespace.EmployeeName» в каждой строке.


person Shailender Singh    schedule 06.02.2011    source источник


Ответы (2)


Во-первых, вам нужно установить для AutoGenerateColumns значение false в DataGrid, чтобы избежать получения типа столбца по умолчанию DataGridTextColumn для всех свойств ваших связанных объектов.

Затем вам нужно определить столбцы в xaml для каждого из свойств ваших связанных объектов, которые вы хотите отобразить. Для свойств простого типа, таких как string или int (например), вы можете просто использовать DataGridTextColumn со стандартной привязкой в ​​свойстве привязки.

Для вашего сложного типа (EmployeeName) вам нужно использовать DataGridTemplateColumn, а затем определить DataTemplate для свойства DataGridTemplateColumn.CellTemplate, которое сообщает столбцу, как отображать EmployeeName. Простой пример, который просто использует один TextBlock и Run для каждого свойства EmployeeName, будет следующим:

<sdk:DataGrid ItemsSource="{Binding MyCollection}"
              AutoGenerateColumns="false">
     <sdk:DataGrid.Columns>
        <sdk:DataGridTemplateColumn>
            <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock>
                        <Run Text="{Binding EmployeeName.Title}"></Run>
                        <Run Text="{Binding EmployeeName.FirstName}"></Run>
                        <Run Text="{Binding EmployeeName.LastName}"></Run>
                    </TextBlock>
                </DataTemplate>
            </sdk:DataGridTemplateColumn.CellTemplate>
        </sdk:DataGridTemplateColumn>
     </sdk:DataGrid.Columns>
</sdk:DataGrid>
person Simon Fox    schedule 06.02.2011
comment
это предполагает Silverlight 4, где свойство Text для Run является свойством зависимости (таким образом, может быть привязано). Если вы не используете 4, вы можете просто сложить 3 TextBlocks, используя StackPanel, ориентированный горизонтально. - person Simon Fox; 07.02.2011
comment
Я думаю, что это немного излишне .... но если OP скажет, что все в порядке, я поддержу ваш ответ, потому что он гораздо более полный, чем мой XD - person Machinarius; 07.02.2011
comment
@Drknezz не уверен, что ты имеешь в виду под излишеством. Единственная разница между вашим ответом и моим заключается в том, что мой использует один столбец сетки для отображения имени, тогда как для вашего потребуется 3. - person Simon Fox; 07.02.2011
comment
DataTemplates здесь действительно не нужны, поскольку элементы могут быть просто привязаны к их ToString(), и это почти все, но я думаю, что оба способа вполне жизнеспособны. Кроме того, если вы спросите меня, было бы лучше иметь отдельные столбцы: p - person Machinarius; 08.02.2011

Вы должны создать каждый столбец в XAML и установить для AutoGenerateColumns значение false, а также вручную привязать каждый столбец к свойству, которое вы хотите отобразить, используя свойство Binding каждого столбца.

http://www.wpftutorial.net/DataGrid.html

На этом сайте больше информации в теме. Он разработан для WPF, но будет работать и для Silverlight;)

Удачи и наслаждайтесь программированием.

person Machinarius    schedule 06.02.2011