参照したディクショナリアダプタを使用してプロパティグリッドにファイルパスエディタを配置する場合は、提案したようにFilePathクラスを作成します。これをすべてプロパティグリッドで機能させるには、エディターと型コンバーターの2つの追加クラスも実装する必要があります。
FilePathオブジェクトが単純なものであると仮定しましょう。
class FilePath
{
public FilePath(string inPath)
{
Path = inPath;
}
public string Path { get; set; }
}
プロパティグリッドにはクラス名が薄い灰色で表示されますが、あまり役に立ちません。このクラスが実際にラップアラウンドする文字列を表示するTypeConverterを作成してみましょう
class FilePathConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
return true;
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (IsValid(context, value))
return new FilePath((string)value);
return base.ConvertFrom(context, culture, value);
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(string))
return destinationType == typeof(string);
return base.CanConvertTo(context, destinationType);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string))
return ((FilePath)value).Path;
return base.ConvertTo(context, culture, value, destinationType);
}
public override bool IsValid(ITypeDescriptorContext context, object value)
{
if (value.GetType() == typeof(string))
return true;
return base.IsValid(context, value);
}
}
TypeConverter属性をFilePathクラスに追加して、文字列との間で変換します。
[TypeConverter(typeof(FilePathConverter))]
class FilePath
{
...
}
これで、プロパティグリッドにタイプ名ではなく文字列が表示されますが、省略記号でファイル選択ダイアログを表示する必要があるため、UITypeEditorを作成します。
class FilePathEditor : UITypeEditor
{
public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return System.Drawing.Design.UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
FilePath path = (FilePath)value;
OpenFileDialog openFile = new OpenFileDialog();
openFile.FileName = path.Path;
if (openFile.ShowDialog() == DialogResult.OK)
path.Path = openFile.FileName;
return path;
}
}
新しいクラスを使用するには、Editor属性をFilePathクラスに追加します。
[TypeConverter(typeof(FilePathConverter))]
[Editor(typeof(FilePathEditor), typeof(UITypeEditor))]
class FilePath
{
...
}
これで、FilePathオブジェクトをIDictionaryに追加して、プロパティグリッドから編集できるようになりました。
IDictionary d = new Dictionary<string, object>();
d["Path"] = new FilePath("C:/");