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

介绍

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

实现

Model:

 1     public class SkinInfo : NotificationObject
 2     {
 3         private string name;
 4         private string assemblyName;
 5 
 6         public string AssemblyName
 7         {
 8             get { return assemblyName; }
 9             set
10             {
11                 if (this.assemblyName != value)
12                 {
13                     assemblyName = value;
14                     base.RaisePropertyChanged("AssemblyName");
15                 }
16             }
17         }
18         public string Name
19         {
20             get { return name; }
21             set
22             {
23                 if (this.name != value)
24                 {
25                     name = value;
26                     base.RaisePropertyChanged("Name");
27                 }
28             }
29         }
      public string Path { get; set; }
30 [XmlIgnore] 31 public ImageSource Image { get; set; } 32 public SkinInfo() 33 { 34 35 } 36 37 public SkinInfo(string skin) 38 { 39 var items = skin.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries); 40 this.Name = items[0]; 41 this.AssemblyName = items[1]; 42 string uriStr = string.Format("/BasicInfoModule;component/Resources/{0}.png", this.Name); 43 this.Image = new BitmapImage(new Uri(uriStr, UriKind.Relative));
         this.Path=uriStr;
44 } 45 }

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文件:

 1   <ComboBox  Grid.Row="2" Grid.Column="1" ItemsSource="{Binding Skins}" SelectedValue="{Binding SelectedSkin}">
 2             <ComboBox.ItemTemplate>
 3                 <DataTemplate>
 4                     <Label  Content="{Binding Name}" Margin="0">
 5                         <Label.ToolTip>
 7                                 <Image Source="{Binding Image}" />
 9                         </Label.ToolTip>
10                     </Label>
11                 </DataTemplate>
12             </ComboBox.ItemTemplate>
13         </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>
原文地址:https://www.cnblogs.com/kissfu/p/3232562.html