资源中的WPF DataTemplate,绑定

时间:2016-06-30 13:10:25

标签: c# wpf

我有以下DataGrid(简化)

<DataGrid ItemsSource="{Binding Something}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Test">
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBox Text="{Binding A}"/>
                    </Grid>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="{Binding A}"/>
                    </Grid>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Test">
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBox Text="{Binding B}"/>
                    </Grid>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="{Binding B}"/>
                    </Grid>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</Datagrid>

有没有办法将DataTemplate移动到资源并将其重用于不同的属性,因此我不必为每个属性复制和粘贴DataTemplate?

2 个答案:

答案 0 :(得分:4)

一个实用的解决方案是在资源级别定义模板,并将它们包装在每列的“ContentPresenter”中。您仍然必须明确定义每列的模板。您仍然可以在一个位置管理模板,并快速查看列绑定的属性。

<DataGrid>
     <!-- Templates in a single place in resources -->
     <DataGrid.Resources>
        <DataTemplate x:Key="CellTemplate">
           <TextBlock Text="{Binding}" />
        </DataTemplate>
        <DataTemplate x:Key="EditCellTemplate">
           <TextBlock Text="{Binding}" />
        </DataTemplate>
     </DataGrid.Resources>
     <DataGrid.Columns>
        <DataGridTemplateColumn>
           <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                 <ContentPresenter Content="{Binding A}" ContentTemplate="{StaticResource CellTemplate}" />
                 </DataTemplate>
              </DataGridTemplateColumn.CellTemplate>
              <DataGridTemplateColumn.CellEditingTemplate>
                 <DataTemplate>
                    <ContentPresenter Content="{Binding A}" ContentTemplate="{StaticResource EditCellTemplate}" />
                 </DataTemplate>
              </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn>
               <DataGridTemplateColumn.CellTemplate>
                  <DataTemplate>
                     <ContentPresenter Content="{Binding B}" ContentTemplate="{StaticResource CellTemplate}" />
                  </DataTemplate>
               </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
               <DataTemplate>
                  <ContentPresenter Content="{Binding B}" ContentTemplate="{StaticResource EditCellTemplate}" />
               </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
         </DataGridTemplateColumn>
      </DataGrid.Columns>
</DataGrid>

答案 1 :(得分:2)

你可以这样做:

<DataGrid ItemsSource="{Binding Something}">
      <DataGrid.Resources>
         <DataTemplate x:key="MyTemplate">
             <Grid>
               <TextBox Text="{Binding}"/>
             </Grid>
         </DataTemplate>
      </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Test" 
                                    CellTemplate="{StaticResource MyTemplate}" 
                                    >
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </Datagrid>

但是你需要重新考虑绑定逻辑,因为你需要在同一个模板中为所有列使用cell datacontext。