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属性实际上解决了问题并不是很有意义.
| 归档时间: |
|
| 查看次数: |
7000 次 |
| 最近记录: |