WPF控件ComboBox 每个Item的ToolTip引发的异常

时间:2024-01-11 18:37:56

介绍

首先介绍下要实现的任务。做一个下拉框,当选择每个项的时候将鼠标发在上面显示该项的ToolTip的内容(Image)。

实现

Model:

     public class SkinInfo : NotificationObject
{
private string name;
private string assemblyName; public string AssemblyName
{
get { return assemblyName; }
set
{
if (this.assemblyName != value)
{
assemblyName = value;
base.RaisePropertyChanged("AssemblyName");
}
}
}
public string Name
{
get { return name; }
set
{
if (this.name != value)
{
name = value;
base.RaisePropertyChanged("Name");
}
}
}
      public string Path { get; set; }
[XmlIgnore]
public ImageSource Image { get; set; }
public SkinInfo()
{ } public SkinInfo(string skin)
{
var items = skin.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);
this.Name = items[];
this.AssemblyName = items[];
string uriStr = string.Format("/BasicInfoModule;component/Resources/{0}.png", this.Name);
this.Image = new BitmapImage(new Uri(uriStr, UriKind.Relative));
         this.Path=uriStr;
}
}

ViewModel:

    public class DUTInfo : NotificationObject
{
public ObservableCollection<AccessoryInfo> Accessories { get; set; }
[XmlIgnore]
public ObservableCollection<SkinInfo> Skins { get; private set; }
public DUTInfo()
{
this.Skins = new ObservableCollection<SkinInfo>(
Config.Instance.Skins.Select<string, SkinInfo>(s => new SkinInfo(s)));
}
}

Xaml文件:

   <ComboBox  Grid.Row="" Grid.Column="" ItemsSource="{Binding Skins}" SelectedValue="{Binding SelectedSkin}">
<ComboBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Name}" Margin="">
<Label.ToolTip>
<Image Source="{Binding Image}" />
</Label.ToolTip>
</Label>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>

测试

此时实现啦功能,现在应该测试下,我打开界面点开下拉框,鼠标在每个Item的位置来回切换时,较短时间后会引发异常:

Specified element is already the logical child of another element. Disconnect it first.

(意思:指定的元素已经是另一个元素的逻辑子元素。请先将其断开连接。)

然后我将图片的绑定属性改为 <Image Source="{Binding Path}" />,此时还会触发异常,但是鼠标在每个Item的位置来回切换时间较长,最总还会引发相同异常。

我想应该是:如果不清除他与前一个父控件的关系,则会报此类错误,解决办法是,再重新作为新的父控件的Content之前,清除他的父类绑定即可。

我仔细想了想ToolTip的功能不会这么弱吧,然后我在<Label.ToolTip>之间顺意输入看看包含了那些属性,我发现有一个<ToolTip>。

我加上之后,重新测试,很长一段时间,都没报错,姑且这么认为是解决了吧!!

最总Xaml文件代码ToolTip改为:

 <Label.ToolTip>
<ToolTip>
<Image Source="{Binding Image}" />
</ToolTip>
</Label.ToolTip>