Привязка к DataTemplate внутри DataGrid - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь работать с сеткой данных в XAML, связанной с ObservableCollection. У меня не было проблем с отображением простого текста с использованием DataGridTextColumns, которые привязаны к отдельным столбцам каждого элемента в ObservableCollection, но я хочу, чтобы изображения также отображались в сетке. Таким образом, я начал работать с DataGridTemplateColumn, но, похоже, не могу понять правильную логику привязки. Я упростил его до простой попытки отображения текста, используя его, прежде чем перейти к вставке изображения.

Ниже приведена упрощенная версия моего кода:

<DataGrid x:Name="DataGrid" Width="Auto" MinWidth="600" AutoGenerateColumns="False"
            SelectionMode="Single"
            ItemsSource="{Binding Collection, Mode=OneWay}" CanUserReorderColumns="True" CanUserSortColumns="True">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="ID" Header="ID" Binding="{Binding ID, Mode=OneWay}"/>
        <DataGridTemplateColumn x:Name="Number" Header="Number">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding DataContext.Number}" DataContext="{Binding Collection, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Когда я использую это специально, я получаю множество ошибок, подобных приведенной ниже:

System.Windows.Data Error: 40 : BindingExpression path error: 'Collection' property not found on 'object' ''DataGrid' (Name='DataGrid')'. BindingExpression:Path=Collection; DataItem='DataGrid' (Name='DataGrid'); target element is 'TextBlock' (Name=''); target property is 'DataContext' (type 'Object')

Я пытался отрегулировать это всеми возможными способами - меняя синтаксис моей текстовой привязки или привязки DataContext разными способами - но я просто продолжаю получать ошибки, подобные приведенным выше, или они просто будут отображаться как пусто, без отображения текста. Другой метод, который я пробовал, не сработал, например:

<TextBlock Text="{Binding Number}" DataContext="{Binding DataContext.Collection, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"/>

Я просто хочу выяснить, как отобразить в сетке что-то такое простое, как текст, чтобы я мог перейти к использованию этой логики для других целей. Кажется, я не могу найти информацию, которая решает мою конкретную проблему.

Я уверен, что это что-то простое, я просто не понимаю логику в XAML, поэтому любые советы или предложения будут оценены.

1 Ответ

0 голосов
/ 14 сентября 2018

TextBlock DataContext уже будет установлен для элемента в коллекции, поэтому вы можете просто привязать его непосредственно к свойству элемента.

<TextBlock Text="{Binding Number}"/>
...