public override IEnumerable <Model.PropertyDescriptor> GetDescriptors()
 {
     foreach (var descriptor in BranchPackage.KnowPropertyDescriptors)
     {
         if (descriptor.Type == MetadataPropertyType.Metadata)
         {
             if (descriptor.Name != null && descriptor.Name.Length == FrameNameLength &&
                 (descriptor.Name.StartsWith(TextFrameStart) || descriptor.Name.StartsWith(UrlLinkFrameStart)) &&
                 descriptor.Name != TxxxFrameName && descriptor.Name != WxxxFrameName)
             {
                 yield return(new Model.PropertyDescriptor(descriptor.Name, PropertyType.String, AccessLevels.Full));
             }
             else
             {
                 yield return(new Model.PropertyDescriptor(descriptor.Name, PropertyType.ByteArray, AccessLevels.Remove));
             }
         }
         else if (descriptor.Type == MetadataPropertyType.MetadataArray)
         {
             if (BranchPackage.Contains(descriptor.Name))
             {
                 var property = BranchPackage[descriptor.Name];
                 var frames   = property.Value.ToArray <ID3V2TagFrame>();
                 if (frames != null)
                 {
                     for (int i = 0; i < frames.Length; i++)
                     {
                         yield return(new Model.PropertyDescriptor(GetPropertyName(frames[i].Id, i + 1), PropertyType.ByteArray, AccessLevels.Remove));
                     }
                 }
             }
         }
     }
 }
 public override void SaveProperty(string name, PropertyType type, dynamic value)
 {
     if (value != null)
     {
         string searchName    = IptcProperty.UserFriendlyNameToName(name);
         var    propertyValue = CreatePropertyValue((MetadataPropertyType)type, value);
         Func <MetadataProperty, bool> condition = p => p.Name == searchName;
         BranchPackage.SetProperties(condition, propertyValue);
     }
 }