WPF中代码设置Tooltip后,原有Binding被覆盖的问题
解决WPF Tooltip绑定被直接赋值覆盖的问题
你的问题根源在于:直接通过代码给xSaveCurrentBtn.Tooltip赋值时,会完全替换掉XAML中定义的带绑定逻辑的ToolTip对象,后续再设置DataContext时,原有的绑定关系已经不存在,所以Tooltip不会更新。
推荐两种解决方案:
方案一:利用绑定的TargetNullValue(最简洁)
直接在XAML的绑定中配置空值处理,无需后台额外编写赋值逻辑。修改Tooltip的绑定表达式,添加TargetNullValue属性,当绑定的ItemName为null(或DataContext为null导致绑定源无效)时,自动显示指定文本:
<usercontrols:ucButton x:Name="xSaveCurrentBtn" ButtonType="ImageButton" ButtonFontImageSize="16" ButtonImageWidth="18" ButtonImageHeight="18" ButtonImageType="Save" Click="xSaveSelectedButton_Click" ButtonStyle="{StaticResource $ImageButtonStyle_Menu}" DockPanel.Dock="Right" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,0,0"> <usercontrols:ucButton.ToolTip> <ToolTip Content="{Binding ItemName, Mode=OneWay, TargetNullValue='No Item Selected'}" ContentStringFormat="Save {0}"/> </usercontrols:ucButton.ToolTip> </usercontrols:ucButton>
之后后台只需要正常设置DataContext即可:
xSaveCurrentBtn.DataContext = WorkSpace.Instance.CurrentSelectedItem;
- 当
CurrentSelectedItem不为null时,Tooltip显示Save {ItemName} - 当
CurrentSelectedItem为null时,自动切换为No Item Selected
方案二:后台代码保留原ToolTip对象(不推荐,仅兼容场景用)
如果必须通过后台代码控制,不要直接赋值Tooltip属性,而是获取XAML中定义的原ToolTip对象,修改其Content内容或重新绑定:
var currentItem = WorkSpace.Instance.CurrentSelectedItem; xSaveCurrentBtn.DataContext = currentItem; var toolTip = xSaveCurrentBtn.ToolTip as ToolTip; if (toolTip == null) return; if (currentItem == null) { // 清空绑定,设置静态文本 BindingOperations.ClearBinding(toolTip, ToolTip.ContentProperty); toolTip.Content = "No Item Selected"; } else { // 重新设置绑定 var binding = new Binding("ItemName") { Mode = BindingMode.OneWay, StringFormat = "Save {0}" }; toolTip.SetBinding(ToolTip.ContentProperty, binding); }
这种方法需要手动维护绑定状态,不如方案一优雅,仅在无法修改XAML的场景下使用。
内容的提问来源于stack exchange,提问作者Amit Amir
相关产品推荐
相关产品推荐

