Привязать столбцы DataGrid к вложенным объектам - PullRequest
0 голосов
/ 29 октября 2018

У меня есть главный объект со свойствами, каждый из которых имеет свой собственный объект:

Package {
    Name
    Date
}

Document {
   Name
   Package1 = Package()
   Package2 = Package()
   Package3 = Package()
   Package4 = Package()
}

Теперь в сетке данных WPF я хотел бы привязать каждый столбец к одному из свойств Document.PackageX.Но привязка Name внутри DataTemplate всегда выбирает Document.Name, а не Package.Name

<DataTemplate x:Key="MyCellTemplate">
    <Border>
        <TextBlock Text="{Binding Name}" />     # this is Package.Name property
    </Border>
</DataTemplate>

<DataGrid ItemsSource="{Binding ListOfDocuments}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Package 1" CellTemplate="{StaticResource MyCellTemplate}"/>
        <DataGridTemplateColumn Header="Package 2" CellTemplate="{StaticResource MyCellTemplate}"/>
        <DataGridTemplateColumn Header="Package 3" CellTemplate="{StaticResource MyCellTemplate}"/>
        <DataGridTemplateColumn Header="Package 4" CellTemplate="{StaticResource MyCellTemplate}"/>
    </DataGrid.Columns>
</DataGrid>

Как мне установить контекст шаблона ячейки для вложенного объекта?

(Прошу прощения за чрезмерное упрощение, но я подумал, что легче читать и объясняет основную проблему)

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вам необходимо определить 4 различных CellTemplates, которые связываются с Package1, Package2, Package3 и Package4 соответственно:

<DataGrid ItemsSource="{Binding ListOfDocuments}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Package 1">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Package1.Name}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Package 2">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Package2.Name}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Package 3">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Package3.Name}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Package 4">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Package4.Name}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Нельзя использовать один и тот же CellTemplate для всех 4 столбцов. Если CellTemplate является более сложным, чем то, что вы показали здесь, вы можете подумать о создании шаблонов программно. Пожалуйста, обратитесь к моему ответу здесь для примера того, как вы можете сделать это.

0 голосов
/ 29 октября 2018

Я предполагаю, что у OP фиксированная структура данных, как он упоминал в вопросе

Document {
   Name
   Package1 = Package()
   Package2 = Package()
   Package3 = Package()
   Package4 = Package()
}

Вам необходимо привязать PackageX.Name свойство к TextBlock, поскольку вы ожидаете ListOfDocuments к DataGrid.

<DataGrid ItemsSource="{Binding ListOfDocuments}">
    <DataGrid.Columns>

        <DataGridTemplateColumn Header="Package 1">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Border>
                        <TextBlock Text="{Binding Package1.Name}" />     # this is Package.Name property
                    </Border>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn Header="Package 2">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Border>
                        <TextBlock Text="{Binding Package2.Name}" />     # this is Package.Name property
                    </Border>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        .....

    </DataGrid.Columns>
</DataGrid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...