Angenommen, ich muss jedes Array in der Erweiterung speichern gerade neu aus der Vorlage erstellt.Speichern Sie Array in Optionen mit DialogPage
Ich habe gerade neue VSIX Projekt hinzugefügt VSPackage es, hinzugefügt dann Option Seitenraster (DialogPage
). Dann folgte ich Anweisungen von Antworten auf eine ähnliche Frage: DialogPage
- string array not persisted.
Und zu Demonstrationszwecken, lassen Sie sich auch int[]
Array und schlicht int
mit benutzerdefinierten Wandler hinzufügen.
// [standard attributes]
[ProvideOptionPage(typeof(OptionPageGrid),
"My Category", "My Grid Page", 0, 0, true)]
public sealed class FooBarVSPackage : Package
{
// standard code
}
public class OptionPageGrid : DialogPage
{
// [typical attributes]
[TypeConverter(typeof(StringArrayConverter))]
public string[] Foos
{ get; set; }
// [typical attributes]
[TypeConverter(typeof(CustomIntConverter))]
public int Bar
{ get; set; }
// [typical attributes]
[TypeConverter(typeof(IntArrayConverter))]
public int[] Bazes
{ get; set; }
}
class StringArrayConverter : TypeConverter
{
// exact copy of code from similar question/answer mentioned above
}
public class IntArrayConverter : TypeConverter
{
private const string delimiter = "#@#";
// CanConvertFrom, ConvertTo, etc. overridden in similar fashion
}
public class CustomIntConverter : TypeConverter
{
// CanConvertFrom() overridden
// CanConvertTo() overridden
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
var v = value as string;
return int.Parse(v.TrimStart('*'));
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
var v = (int)value;
return v.ToString().PadLeft(25, '*');
}
}
Wenn ich diese Optionen bearbeiten, kann ich sehen, dass der Konverter wirklich funktioniert:
Aber nachdem ich es wieder öffnen, zwei der Werte weg! Nur Normal int
beharrte:
Es gibt auch eine seltsame Sache: wie und wann TypeConverter
Methoden aufgerufen werden. CanConvertTo()
ist nie während der gesamten Sitzung aufgerufen. CanConvertFrom()
und ConvertTo()
werden oft und mehr oder weniger in erwarteter Weise genannt. Und ConvertFrom()
heißt nur, wenn die Zeichenfolgendarstellung der Option direkt bearbeitet wird, d. H. Es nicht teilnehmen in Laden/Speichern Optionen überhaupt!
Ich bin nicht sicher, aber es fühlt sich ein bisschen wie int
Option wird als int
gespeichert und wandte sich aus/in string
nur in Optionen GUI, während Array Optionen leise nur versucht, nicht das gleiche zu tun.
PS: Wenn Sie direkt spielen mit dem Beispiel persönlich wollen, hier ist ein GitHub Repo mit dem Beispielprojekt in Frage: FooBarVSIXProject
Dies ist ein Fehler in VS 2015 MS im Wesentlichen die Logik in DialogPage.LoadSettingsFromStorage und SaveSettingsToStorage zwischen VS 2013 und VS 2015 geändert, und sie brach LoadSettingsFromStorage für Eigenschaften, die Typeconverter verwenden. Ich habe dies über den "Problem melden" -Dialog von VS 2015 und über Connect gemeldet, also werden sie es eventuell beheben. In der Zwischenzeit musste ich auch mit Overrides umgehen, wie du es getan hast. Hinweis: TypeConverter sind weiterhin nützlich, um Werte im PropertyGrid zu bearbeiten. Außerdem befindet sich der MS-Fehler in DialogPage.SetPropertyValue, der Convert.ChangeType jetzt aufruft. –