Как да зададете конкретен Datacontext за 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... е това< /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