Как установить определенный контекст данных для DataTemplate в CellTemplate

В настоящее время я привязываюсь к List<T>, поэтому мне нужно сделать конкретный набор для каждого столбца отдельным DataTemplate

так:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
       <TextBlock TextAlignment="Center" 
                  Text="{Binding ObColl[1].Std, UpdateSourceTrigger=PropertyChanged}"
                  Background="{Binding ObColl[1].DienstColor, TargetNullValue=Transparent,FallbackValue=Transparent}" />
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

но я хочу создать DataTemplate один раз как ресурсы

<DataGrid.Resources>
        <DataTemplate x:Name="MyCellTemplate">
           <TextBlock TextAlignment="Center" 
                      Text="{Binding Std, UpdateSourceTrigger=PropertyChanged}"
                      Background="{Binding DienstColor, TargetNullValue=Transparent,FallbackValue=Transparent}" />
        </DataTemplate>
</DataGrid.Resources>

и использовать его как

<DataGridTemplateColumn CellTemplate="{StaticResource MyCellTemplate} ??{Binding ObColl[1]}??"/>

Но для этого мне нужно указать DataContext (ObColl[Idx]) в моем DataGridTemplateColumn, но как мне это сделать?


РЕДАКТИРОВАТЬ

xaml должен выглядеть так:

    <DataGrid Name="dataGrid1"
              ItemsSource="{Binding Itemlist, UpdateSourceTrigger=PropertyChanged}">
        <DataGrid.Resources>
            <DataTemplate x:Key="MyCellTemplate">
                <TextBlock TextAlignment="Center" 
                           Text="{Binding Std, UpdateSourceTrigger=PropertyChanged}" 
                            Background="{Binding DienstColor, TargetNullValue=Transparent, FallbackValue=Transparent}" />
            </DataTemplate>

        </DataGrid.Resources>

        <DataGrid.Columns> 
            <!-- Column 1 -->
            <DataGridTemplateColumn CellTemplate="{StaticResource MyCellTemplate}" 
                                    DataContext={Binding ObColl[0]}/> 
            <!-- Column Header 2 -->
            <DataGridTemplateColumn CellTemplate="{StaticResource MyCellTemplate}" 
                                    DataContext={Binding ObColl[1]}/> 
        </DataGrid.Columns>
    </DataGrid>

DataContext={Binding ObColl[1]} - проблемная часть, потому что ее не существует....


person WiiMaxx    schedule 20.11.2013    source источник
comment
Я не понимаю вашего вопроса... зачем вам устанавливать DataContext из DataGridTemplateColumn? Это уже неявно сделано элементом управления DataGrid, не так ли? В DataTemplate у вас уже должен быть доступ к свойствам объекта(ов) в коллекции, данные которой привязаны к свойству DataGrid.ItemsSource.   -  person Sheridan    schedule 20.11.2013
comment
мой DataContext представляет собой СПИСОК для доступа к объекту, мне нужно указать элемент в списке, например [0] (чтобы получить первый), но если я использую DataTemplate как StaticResource, мне нужно указать DataContext.. .   -  person WiiMaxx    schedule 20.11.2013
comment
Это List<T> не задано как свойство DataGrid.ItemsSource? если я использую DataTemplate как StaticResource, мне нужно указать DataContext - я не думаю, что это правда. Единственный раз (в этой ситуации), когда вам нужно указать DataContext, это если вы хотите Bind к объекту, отличному от объекта в коллекции, данные которого привязаны к свойству DataGrid.ItemsSource... это that< /i> что ты пытаешься сделать?   -  person Sheridan    schedule 20.11.2013
comment
нет, это немного сложнее, мой DataGrid.ItemsSource - это список MyRow, который содержит 2 свойства, первое из которых - MyRowheader, а второе - MyCellList, которое является List<T>   -  person WiiMaxx    schedule 20.11.2013
comment
И вы просто хотите показать одно значение из MyCellList в каждой строке вашего DataGrid? Если да, то это то же самое значение или другое значение из MyCellList в каждой строке?   -  person Sheridan    schedule 20.11.2013
comment
это одно и то же значение в каждой строке   -  person WiiMaxx    schedule 20.11.2013


Ответы (1)


Хорошо, вот как я понимаю ваше требование... у вас есть класс MyRow с двумя свойствами; MyRowheader и MyCellList. Вы хотите отобразить значение MyRowheader и одно значение из коллекции MyCellList в каждой строке вашего DataGrid. Вот как бы я это сделал:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding YourCollection}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Header" Binding="{Binding MyRowheader, 
UpdateSourceTrigger=PropertyChanged}" />
        <DataGridTemplateColumn Header="Cell list">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding MyCellList[1].Std, UpdateSourceTrigger=
PropertyChanged}" Background="{Binding MyCellListl[1].DienstColor, TargetNullValue=
Transparent, FallbackValue=Transparent}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Пожалуйста, дайте мне знать, если я неправильно понял ваше требование.


ОБНОВЛЕНИЕ >>>

Так что я неправильно понял ваше требование. Похоже, вам нужно одно значение из вашей коллекции MyCellList в каждом столбце, а не в строке DataGrid. В этом случае мой ответ будет отрицательным, вы не можете настроить свой DataGrid.Columns с помощью DataTemplate или любой другой функции сохранения XAML. XAML — многословный язык... есть несколько способов написать его более эффективно, но не так много. На страницах XAML часто можно встретить повторяющийся код.

Единственный способ, который я могу придумать, чтобы вы могли писать меньше кода, - это динамически генерировать столбцы из кода. Вы можете найти базовый пример этого в разделе Динамическое добавление столбцов в DataGrid в wpf< /а> сообщение. Я не знаю, сколько времени это сэкономит вам, хотя на самом деле.

person Sheridan    schedule 20.11.2013
comment
хорошо, теперь вы получили то, чего я хочу достичь, но я хочу удалить повторение, потому что в основном это всегда один и тот же код. Если вы внимательно посмотрите на XAML, вы увидите, что ваш ответ — это то, что я уже делаю (ObColl[1] == MyCellListl[1]). Боюсь, но мой английский недостаточно хорош, чтобы лучше описать проблему - person WiiMaxx; 20.11.2013
comment
Я взял этот код из вашего примера, так что да, этот бит тот же. Я все еще изо всех сил пытаюсь полностью понять, что вы хотите. Можете ли вы объяснить, что вы подразумеваете под «удалить повторение», пожалуйста? - person Sheridan; 20.11.2013
comment
хорошо, позвольте мне попробовать еще раз, Datatemplate всегда будет таким же, единственное, что изменится, это индекс в моем ObColl[??], потому что DataContext является объектом MyRow, поэтому я пытаюсь указать DataContext, чтобы получить MyCell как DataContext для Datatemplate - person WiiMaxx; 20.11.2013
comment
О... когда я спросил вас, это одно и то же значение или другое значение из MyCellList в каждой строке, вы сказали одно и то же значение... теперь вы говорите что каждая строка должна отображать разные значения из коллекции MyCellList? - person Sheridan; 20.11.2013
comment
Нет... каждому столбцу нужен новый индекс, а не строка (я отредактирую свой вопрос) - person WiiMaxx; 20.11.2013
comment
пожалуйста, взгляните на мое редактирование - person WiiMaxx; 20.11.2013