[英]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
中处理TextBlock
的Loaded
事件,如下所示:
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.