i最初有一个“不能施放internal.internal.namedobject到[x]”错误。据我了解,错误会触发,因为绑定找不到指定的属性。但是,我试图使用2个文本块进行调试,看看绑定是否给我一些东西,它们似乎可以正常工作。我已经抓住稻草了几个小时,我只是找不到问题。 基本上,我有一个工具提示,我不想看到它是空的,要么被布尔值设置为“隐藏”。 the是部分XAML:
<UserControl x:Class="TidyDesk.UserControls.BoxButton"
[...]
xmlns:local="clr-namespace:TidyDesk.UserControls"
xmlns:conv="clr-namespace:TidyDesk.Converters"
mc:Ignorable="d"
Width="{Binding BtnSize}"
Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"
Name="ThisUserControl"
d:DesignHeight="100" d:DesignWidth="100">
<UserControl.Resources>
[...]
<conv:ToolTipVisibilityMultiConverter x:Key="TTVisConv"/>
</UserControl.Resources>
<StackPanel>
<TextBlock Text="{Binding ShowToolTip}"/>
<TextBlock Text="{Binding ToolTipText}"/>
<Image Name="img" Stretch="Fill"
Source="{Binding ImgPath}"
Width="{Binding ImgSize}"
Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"
>
<Image.ToolTip>
<ToolTip Content="{Binding ToolTipText}" ToolTipService.InitialShowDelay="10">
<ToolTip.Visibility>
<MultiBinding Converter="{StaticResource TTVisConv}">
<Binding Path="DataContext.ShowToolTip" ElementName="ThisUserControl"/>
<Binding Path="DataContext.ToolTipText" ElementName="ThisUserControl" />
</MultiBinding>
</ToolTip.Visibility>
</ToolTip>
</Image.ToolTip>
[...]
</Image>
[...]
</StackPanel>
</UserControl>
namespace TidyDesk.UserControls
{
public partial class BoxButton : UserControl
{
public BoxButton()
{
InitializeComponent();
DataContext = this;
[...]
}
[...]
public string ToolTipText { get; set; } = "";
public bool ShowToolTip { get; set; } = true;
}
}
这是转换器:
namespace TidyDesk.Converters
{
public class ToolTipVisibilityMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (!(bool)values[0] || String.IsNullOrEmpty((string)values[1]))
return Visibility.Collapsed;
else
return Visibility.Visible;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
到目前为止,我尝试过:
<Binding Path="DataContext.ShowToolTip" ElementName="ThisUserControl"/>
<Binding Path="ShowToolTip" ElementName="ThisUserControl"/>
<Binding Path="ShowToolTip" RelativeSource="{RelativeSource FindAncestor, AncestorType=local:BoxButton}"/>
<Binding Path="ShowToolTip" RelativeSource="{RelativeSource FindAncestor, AncestorType=UserControl}"/>
<Binding Path="DataContext.ShowToolTip" RelativeSource="{RelativeSource FindAncestor, AncestorType=Image}"/>
一样过滤掉的情况。
if (values[0] != DependencyProperty.UnsetValue && values[1] != DependencyProperty.UnsetValue)
return Visibility.Collapsed;
this已被标记为this问题...但是随后工具提示总是崩溃,并且绑定仍然“找不到原点”。这里有什么问题?我想念明显的东西吗?
的重复,该问题解决了一个不同的问题,并且没有提及任何地方如何解决我遇到的约束问题。他们试图将工具提示与另一个元素的价值联系起来,我将其绑定到代码范围内声明的公共财产。就我而言,仅设置绑定路径就足够了,而没有像这样的位置。它还没有提及我遇到的工具提示的初始化问题(不设值)。 我更改了标题,使其与我遇到的问题更加相关。不确定这是否会留在这里,但是那里必须有其他人损失数小时来隐藏一个空的工具提示,同时也可以用布尔来禁用它。
该代码有效:<Image.ToolTip>
<ToolTip Content="{Binding ToolTipText}" ToolTipService.InitialShowDelay="10">
<ToolTip.Visibility>
<MultiBinding Converter="{StaticResource TTVisConv}">
<Binding Path="ShowToolTip"/>
<Binding Path="ToolTipText" />
</MultiBinding>
</ToolTip.Visibility>
</ToolTip>
</Image.ToolTip>
他们在评论中提出的这篇文章,他们解释说工具提示/弹出/contexentMenu是在主窗口上显示在主窗口上的,因此具有不同的视觉树。这意味着在这种情况下无法使用元素名称和亲戚,因为它们会搜索工具提示的视觉树,而不是主要的树,什么也没找到。这就是为什么它不起作用。 我不确定为什么尽管在另一个窗口上,工具提示仍然可以访问主窗口的数据台面,但我将其留给另一个问题。