首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用xaml从DatagridTextColumn中获取DataGridColumnHeader名称

如何使用xaml从DatagridTextColumn中获取DataGridColumnHeader名称
EN

Stack Overflow用户
提问于 2012-11-14 04:59:35
回答 1查看 3.5K关注 0票数 0

我为DataGridTextColumn的DataGrid定义了以下xaml代码。

代码语言:javascript
复制
<DataGridTextColumn x:Name="UserIdColumn" Binding="{Binding Path=UserId}" HeaderStyle="{StaticResource DataGridHeaderStyle}"/>

这是HeaderStyle的DataGridTextColumn

代码语言:javascript
复制
<Style x:Key="DataGridHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="DataGridColumnHeader">
                <StackPanel>
                    <TextBlock x:Name="ColumnName" Text="UserId" />
                    <TextBox x:Name="UserIdFilter" Width="100">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="TextChanged">
                                <cal:ActionMessage MethodName="UserIdFilterChanged">
                                    <cal:Parameter Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridTextColumn}}, Path=Name}"/>
                                    <cal:Parameter Value="{Binding ElementName=UserIdFilter, Path=Text}" />
                                </cal:ActionMessage>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </TextBox>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>    

可以看到,我正在尝试使用以下代码来访问DataGridTextColumn的Name属性中的DataGridColumnHeader的ControlTemplate

代码语言:javascript
复制
<cal:Parameter Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridTextColumn}}, Path=Name}"/>

上面的行返回null,为什么?

还有其他方法可以从DataGridColumnHeader的控件模板中获取DataGridTextColumn的Name属性吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-14 10:01:43

您正在恢复一个空值,原因有两个:第一个原因是,DataGridTextColumn不是可视树的一部分,也不是数据集的可视实例。这只是一个实例,它描述了应该如何显示数据栅格的列。因此,DataGridTextColumn不是你细胞祖先的一部分。我看到恢复您的DataGridTextColumn的唯一方法是以某种方式这样做:

代码语言:javascript
复制
<TextBox x:Name="UserIdFilter" Width="100" Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}, Path=Columns[0]}">

这样,您应该使用DataGridTextColumn实例设置Textbox的Tag属性(您可以使用snoop检查它是否正常工作)

然后,解释为什么您有空值的第二个原因是DataGridTextColumn没有Name属性。您可以做的就是创建一个附加属性,就像下面这样:

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

    public static string GetName(DependencyObject obj)
    {
        return (string)obj.GetValue(NameProperty);
    }

    public static void SetName(DependencyObject obj, string value)
    {
        obj.SetValue(NameProperty, value);
    }
}

..。将列定义的名称替换为:

代码语言:javascript
复制
<DataGridTextColumn alias:XamlHelper.Name="UserIdColumn" Binding="{Binding Path=UserId}" HeaderStyle="{StaticResource DataGridHeaderStyle}"/>

并以这种方式检索该属性:

代码语言:javascript
复制
<Style x:Key="DataGridHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="DataGridColumnHeader">
                <StackPanel>
                    <TextBlock x:Name="ColumnName" Text="UserId" />
                    <TextBox x:Name="UserIdFilter" Width="100"  Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}, Path=Columns[0]}">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="TextChanged">
                                <cal:ActionMessage MethodName="UserIdFilterChanged">
                                    <cal:Parameter Value="{Binding ElementName=UserIdFilter, Path=Tag.(alias:XamlHelper.Name)}"/>
                                    <cal:Parameter Value="{Binding ElementName=UserIdFilter, Path=Text}" />
                                </cal:ActionMessage>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </TextBox>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>   

..。希望我在这段代码中没有犯太多错误,但我认为这样的事情应该有效

注意,我使用了textbox的tag属性有一个缓冲区,因为我确信绑定的findAncestor模式能够正确地恢复数据存储(我在元素上有一些问题不是视觉树)。也许在你的参数中有一个独特的绑定也有效..。

标记也很适合进行测试,因为它允许查看窥探中的值!

如果有些问题不清楚,请不要犹豫。

编辑:,我检查了DataGridCOlumnHeaderClass,发现了似乎包含您期望的属性.因此,应该可以这样做:

代码语言:javascript
复制
<Style x:Key="DataGridHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="DataGridColumnHeader">
                <StackPanel>
                    <TextBlock x:Name="ColumnName" Text="UserId" />
                    <TextBox x:Name="UserIdFilter" Width="100"  Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridColumnHeader}}, Path=Column}">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="TextChanged">
                                <cal:ActionMessage MethodName="UserIdFilterChanged">
                                    <cal:Parameter Value="{Binding ElementName=UserIdFilter, Path=Tag.(alias:XamlHelper.Name)}"/>
                                    <cal:Parameter Value="{Binding ElementName=UserIdFilter, Path=Text}" />
                                </cal:ActionMessage>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </TextBox>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>   
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13373293

复制
相关文章

相似问题

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