テンプレートから新しく作成した拡張モジュールに配列を格納する必要があるとします。DialogPageを使用してオプションで配列を格納する
私はちょうど新しいVSIXプロジェクトを作成し、それにVSPackageを追加し、その後、オプションページグリッド(DialogPage
)を追加しました。それから私は、同様の質問への回答からの指示に続く:DialogPage
- string array not persisted.
をそして、デモの目的のために、のは、カスタム型コンバータでint[]
アレイと平野int
を追加してみましょう。
をしかし、私はそれを再び開いた後、値の2がなくなっ:
// [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, '*');
}
}
私はそれらのオプションを編集するとき、私は、コンバータが実際に動作することを確認することができます!唯一の平野int
は持続:いつ、どのようにTypeConverter
メソッドが呼び出されます。また、1奇妙なことがあり
。はであり、決してはセッション全体で呼び出されません。 CanConvertFrom()
およびConvertTo()
は、多くの場合、予想される方法で多かれ少なかれ呼び出されます。 はとなります。はオプションの文字列表記を直接編集すると、はオプションの読み込み/保存にまったく参加しません。
私はわからないんだけど、それはint
オプションのようなビットがint
として保存され、配列オプションはただ黙って同じことをやろうと失敗しながら、唯一のオプションのGUIにstring
へ/からなって感じています。
PS:あなたが直接個人的に例を挙げて再生したい場合は、ここで問題になっているサンプルプロジェクトでGitHubのレポです:FooBarVSIXProject
これはVS 2015のバグです.MSはDialogPage.LoadSettingsFromStorageとSaveSettingsToStorageのロジックをVS 2013とVS 2015の間で大幅に変更し、TypeConvertersを使用するプロパティのLoadSettingsFromStorageを壊しました。私はこれをVS 2015の「問題を報告する」ダイアログとConnectを介して報告しました。最終的には問題を解決するかもしれません。その間、私はあなたのようにオーバーライドで回避策を講じなければなりませんでした。注:TypeConvertersは、PropertyGridで値を編集する場合にも有効です。また、MSバグはDialogPage.SetPropertyValueにあり、Convert.ChangeTypeを呼び出すだけです。 –