首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何绑定到模板

如何绑定到模板
EN

Stack Overflow用户
提问于 2020-12-07 21:29:06
回答 1查看 47关注 0票数 0

我正试图向默认的TextBox中添加一个ComboBox (当我完成此工作时,还会添加一个ComboBox),并且已经这样做了,如下所示。这在应用程序ResourceDirectory^:

代码语言:javascript
复制
<Style x:Key="DataGridColumnHeaderStyle_TextBox" TargetType="{x:Type DataGridColumnHeader}">
   <Setter Property="VerticalContentAlignment" Value="Center"/>
   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
            <Themes:DataGridHeaderBorder Grid.Row="0" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" IsClickable="{TemplateBinding CanUserSort}" IsPressed="{TemplateBinding IsPressed}" IsHovered="{TemplateBinding IsMouseOver}" Padding="{TemplateBinding Padding}" SortDirection="{TemplateBinding SortDirection}" SeparatorBrush="{TemplateBinding SeparatorBrush}" SeparatorVisibility="{TemplateBinding SeparatorVisibility}">
               <Grid>
                  <Grid.RowDefinitions>
                     <RowDefinition Height="*"/>
                     <RowDefinition Height="*"/>
                  </Grid.RowDefinitions>
                  <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                  <TextBox Grid.Row="1" Text="" HorizontalAlignment="Stretch" BorderThickness="1" />
                  <Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}"/>
                  <Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}"/>
               </Grid>
            </Themes:DataGridHeaderBorder>
         </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>

在我的Window DataGrid中,我有以下内容:

代码语言:javascript
复制
<DataGridTextColumn Header="PO Number" Binding="{Binding PO_Number}" HeaderStyle="{DynamicResource DataGridColumnHeaderStyle_TextBox}"/>

这看起来像我现在想要的样子,Header文本绑定到ContentPresenter上。

问题

如何设置它,以便绑定到新添加的TextBox (或其他任何对象),如:HeaderTemplate.TextBox.Text="{Binding SomeSubTotalClass}"

代码语言:javascript
复制
<DataGridTextColumn Header="PO Number" HeaderTemplate.TextBox.Text="{Binding SomeSubTotalClass}" Binding="{Binding PO_Number}" HeaderStyle="{DynamicResource DataGridColumnHeaderStyle_TextBox}"/>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-08 10:07:52

您可以为自定义列标题创建一组附加属性。

代码语言:javascript
复制
public static class DataGridHeaderProperties
{
   public static readonly DependencyProperty TextProperty = DependencyProperty.RegisterAttached(
      "Text", typeof(string), typeof(DataGridHeaderProperties));

   public static string GetText(DependencyObject dependencyObject)
   {
      return (string)dependencyObject.GetValue(TextProperty);
   }

   public static void SetText(DependencyObject dependencyObject, string value)
   {
      dependencyObject.SetValue(TextProperty, value);
   }
}

然后调整列标题模板,以便TextBoxTextBox属性绑定到相应的数据网格列定义中指定的附加属性。

代码语言:javascript
复制
<TextBox Grid.Row="1" Text="{Binding Column.(local:DataGridHeaderProperties.Text), RelativeSource={RelativeSource AncestorType={x:Type DataGridColumnHeader}}}" HorizontalAlignment="Stretch" BorderThickness="1" />

现在,在列定义上设置属性。下面只有一个用于测试的静态文本,但是您可以以任何方式绑定该属性。

代码语言:javascript
复制
<DataGridTextColumn Header="PO Number"
                    Binding="{Binding PO_Number}"
                    HeaderStyle="{StaticResource DataGridColumnHeaderStyle_TextBox}"
                    local:DataGridHeaderProperties.Text="My custom text"/>

但是,请注意,列不是可视树的一部分,也没有可以绑定到的数据上下文,因此必须使用binding proxy或其他机制。对于DataGrid来说,这是一个众所周知的问题,而不是这个问题的核心,但是在StackOverflow上已经有了解决方案。

可以将此解决方案扩展到列标题中的任何其他控件,如ComboBox。您只需添加附加属性,例如对于ItemsSourceSelectedItem等,但是您也应该投资一些来改进这个概念。将这类控件放入列标题中似乎很奇怪。它可能会损害应用程序的可用性。也许有一种更适合您的需求的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65189692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档