【问题标题】:WPF DataTemplate in resource, binding资源中的 WPF DataTemplate,绑定
【发布时间】:2016-06-30 13:10:24
【问题描述】:

我有下面的 DataGrid(simplified)

<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?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    一个务实的解决方案是在资源级别定义模板并将它们包装在每列的“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>
    

    【讨论】:

      【解决方案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>
      

      但是您需要重新考虑绑定逻辑,因为您需要在同一模板中为所有列使用单元格数据上下文。

      【讨论】:

      • 据我了解 {Binding} 将整个对象绑定到模板,那么如何将特定属性绑定到模板列?
      • @blackcat 没有什么能阻止您在资源中拥有两个数据模板(一个用于绑定到 A,一个用于绑定到 B),仍然比四个好。
      • @adminSoftDK 我仍然需要四个数据模板(编辑并显示我将拥有 {Binding A} 和 {Binding B} 的位置),我正在为此寻找通用解决方案
      • @adminSoftDK 使您所有绑定的类都遵循模板仅绑定到的Interface,这样,对于许多不同的对象类型,只需要一个模板。
      猜你喜欢
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      相关资源
      最近更新 更多