如何在CellTemplate中为DataTemplate设置特定的Datacontext

时间:2013-11-20 10:56:56

标签: wpf binding datagrid datatemplate celltemplate

目前我绑定到List<T>所以我必须将特定的foreach列作为单独的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中具体说明DataGridTemplateColumn(ObColl [Idx]) 但我该怎么做?


修改

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]}是问题部分,因为它不存在....

1 个答案:

答案 0 :(得分:1)

好的,这是我对你的要求的理解......你有一个MyRow类有两个属性; MyRowheaderMyCellList。您希望在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>

如果我误解了你的要求,请告诉我。


更新&gt;&gt;&gt;

所以我确实误解了你的要求。您似乎想要MyCellList的每个中的DataGrid集合中的一个值,而不是DataGrid.Columns的行。在这种情况下,我的回答是否定的,您无法使用DataTemplate或任何其他XAML保存功能设置{{1}}。 XAML是一种冗长的语言......有一些方法可以更有效地编写它,但不是很多。您经常会在XAML页面上找到重复的代码。

我能想到的唯一可以编写更少代码的方法就是从代码中动态生成列。您可以在Dynamically add Columns to DataGrid in wpf帖子中找到相关的基本示例。我不知道有多少时间可以拯救你。