WPF工具提示不会更新

Mik*_*lls 10 .net c# wpf binding

假设我有一个代表工作人员的简单类

class Staff
{
    public string FirstName { get; set; }
    public string FamilyName { get; set; }
    public int SecondsAlive { get; set; }        
}
Run Code Online (Sandbox Code Playgroud)

我有一个DataTemplate供员工使用

<DataTemplate DataType={x:Type Staff}>
    <StackPanel Orientation="Horizontal">
        <TextBlock Text={Binding FirstName}/>
        <TextBlock Text=" ">
        <TextBlock Text={Binding FamilyName}/>
        <StackPanel.ToolTip>
            <TextBlock Text={Binding SecondsAlive}/>
        </StackPanel.ToolTip>
     </StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

然后我在ListBox中显示了一大堆人员

myListBox.ItemsSource = GetAllStaff();
Run Code Online (Sandbox Code Playgroud)

很标准的东西.我遇到的问题是显示某人活着的秒数的工具提示没有得到更新.当你第一次将鼠标悬停在一名工作人员身上时,它可以正常工作,但从那时起它就永远保持这个价值.我可以实现INotifyPropertyChanged来解决这个问题,但是每当SecondsAlive发生变化时,每个工作人员都可以做到这一点.假设我在列表中有400名员工,那么我必须筹集400个事件,即使用户可能永远不会查看另一个工具提示.我想要的是使工具提示请求显示SecondsAlive属性.那可能吗?

请注意,这只是一个例子,我不需要知道我的员工活了多少秒:-)但我有同样的问题,我需要提高一个甚至大约400次只是为了一个工具提示,有人可能不会看.

Mik*_*lls 30

我的天啊!!!我终于找到了解决这个问题的方法!这几个月一直困扰着我.我并不感到惊讶,没有人回答这个,因为我在顶部输入的代码实际上并没有显示我试图重现的问题,实际上它显示了解决方案.答案是,如果您定义这样的工具提示

    <StackPanel.ToolTip>
        <TextBlock Text="{Binding SecondsAlive}"/>
    </StackPanel.ToolTip>
Run Code Online (Sandbox Code Playgroud)

然后一切正常,花花公子,没有必要在"SecondsAlive"上提出一个propertyChanged事件.每次显示工具提示时,框架都会调用SecondsAlive属性.当您像这样定义工具提示时出现问题:

    <StackPanel.ToolTip>
        <ToolTip>
            <TextBlock Text="{Binding SecondsAlive}"/>
        </ToolTip>
    </StackPanel.ToolTip>
Run Code Online (Sandbox Code Playgroud)

在那里有额外的工具提示标记是有道理的,当然你需要创建一个工具提示对象来将其分配给tooltip属性,但这是不正确的.您分配给tooltip属性的实际上是工具提示的内容.我假设您需要为其显示文本块和图像等控件,但您可以传入任何内容,它将像内容控件一样显示内容.看到它继承了内容控制这是有道理的:-)一旦你知道这一切似乎很明显:-)

谢谢大家看这个.

PS.我发现了一个额外的问题,即简化代码的下一个逻辑步骤是将文本直接分配给工具提示,如下所示(假设您的工具提示是纯文本):

 <TextBlock Text="{Binding Path=StaffName}" ToolTip="{Binding Path=StaffToolTip}"/>
Run Code Online (Sandbox Code Playgroud)

这也导致我遇到的原始问题.这是有道理的,因为属性StaffToolTip的结果被分配给tooltip属性,永远不会再被调用.但是,为什么然后将textBlock分配给tooltip属性实际上解决了问题并不是很有意义.