繁体   English   中英

如何指定单元格模板中使用的 XAML 仅在工具提示出现时执行?

[英]How do I specify the XAML that's used in a cell template to only execute when the tooltip appears?

我正在开发一个用户控件,该控件显示人们的名字和姓氏、他们关联的机构以及 DataGrid 中的其他项目。 就本次讨论而言,最重要的是他们的社会安全号码的最后 4 位数字。 我们加密了 SSN,所以为了显示 SSN,我必须解密它。 但是,编写加密/解密代码并对其进行测试的同事说,他所做的测试导致代码针对我们拥有的所有人员数据运行了 45 分钟。 显然,如果渲染数据网格需要 45 分钟,那么没有人会等待用户控件出现。

所以,我的老板让我在 SSN 列中放置一些文本,说它是隐藏的,然后当用户将鼠标悬停在控件上时,它会弹出一个工具提示,显示 SSN 的最后 4 个。 起初,我认为这很容易做到,但后来我意识到,当我过去这样做时,我正在检索所有数据,然后显示工具提示中未显示的内容。 我不能那样做。 那么,我该如何做到这一点,以便在弹出工具提示时,它才会检索给定 ID 的 SSN,然后显示 SSN 的最后 4 个?

这是我目前拥有的,首先是我为工具提示创建的样式:

<UserControl.Resources>
    <Style TargetType="TextBlock" x:Key="DelayToolTip">
        <Setter Property="ToolTipService.Placement" Value="Top" />
        <Setter Property="ToolTipService.InitialShowDelay" Value="1000" />
        <Setter Property="ToolTipService.ShowDuration" Value="10000" />
    </Style>
</UserControl.Resources>

这是我为数据网格的列提供的 XAML:

<DataGrid.Columns>
    <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" />
    <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
    <DataGridTextColumn Header="Agency Name" Binding="{Binding Agency.AgencyName}" />
    <DataGridTextColumn Header="Operator #" Binding="{Binding PersonnelCertifications[0].CertIdentifier}" />
    <DataGridTemplateColumn Header="SSN">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="Hidden"
                           Foreground="DarkOrange"
                           Background="Aquamarine"
                           Margin="3,1"
                           Style="{StaticResource DelayToolTip}"
                           Padding="3">
                    <TextBlock.ToolTip>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="SSN: "
                                       FontWeight="Bold" />
                            <TextBlock Text="{Binding ID}" />
                        </StackPanel>
                    </TextBlock.ToolTip>
                </TextBlock>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>

目前它显示 ID 值。 我需要使用该 ID 值来调用我的同事编写的存储过程,以解密 SSN。

我正在使用 VS 2019,.NET 4.5.2

例如,您可以在Tooltip中处理TextBlockLoaded事件,如下所示:

private async void TextBlock_Loaded(object sender, RoutedEventArgs e)
{
    TextBlock textBlock = (TextBlock)sender;
    int id = (textBlock.DataContext as Person)?.ID;
    string ssn = await Task.Run(() => { /*call SP and return the SSN here...*/ });
    textBlock.Text = ssn;
}

XAML:

<DataTemplate>
    <TextBlock Text="Hidden"
               Foreground="DarkOrange"
               Background="Aquamarine"
               Margin="3,1"
               Style="{StaticResource DelayToolTip}"
               Padding="3">
        <TextBlock.ToolTip>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="SSN: " FontWeight="Bold" />
                <TextBlock Text="Loading...." Loaded="TextBlock_Loaded" />
            </StackPanel>
        </TextBlock.ToolTip>
    </TextBlock>
</DataTemplate>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM