« 構造体/クラスプロパティを展開可能にする(2) | トップページ | 構造体/クラスプロパティを展開可能にする(4)[最終回] »

2010年10月 8日 (金)

構造体/クラスプロパティを展開可能にする(3)

前回の「構造体/クラスプロパティを展開可能にする(2)」の続きです。前回RectStruct/RectClass を、RectConverter クラスを作成する事によって、プロパティの展開・編集が可能な状態になりましたが、RectStruct と RectClass で違う動作をする部分がありました。

前回予告通り、今回は RectConverter クラスの手本とした、MSDNの.NET Framework の PropertyGrid コントロールの高度な活用「展開可能オブジェクトのサポートを提供するには」の例題では、同じ挙動を示すのかを検証します。

まずは、例題で使用している SpellingOptionsConverter クラスまでを実装して、実際にプロパティグリッドを表示した画面です。

ここから、例えば SpellCheckCAPS の項の初期値 False から、True に変更してみましょう。

変更しても、SpellCheckOptions 項の文字列内容は、変わりません。本当はここの「大文字の確認:」の False が True に変わらなければなりません。そして、SpellCheckOptions にフォーカスを移動すると、

この時点で、ようやく True に内容が変わります。つまり RectClass と同じ現象が発生します。

ちなみに Font プロパティでテストすれば明白ですが、クラスプロパティでも、メンバプロパティを変更すれば、その場で変更が反映されます。この例題には WindowFont プロパティがついているので、それで実験すると、初期表示"MS UI Gothic, 9pt"の状態で、Size プロパティを 9 から 10 に変更すると、その場で WindowFont の項も、"MS UI Gothic, 10pt"に表示が変わります。

つまり、この例題の SpellingOptionsConverter の実装は、CanConvertTo,ConvertTo,CanConvertFrom,ConvertFrom の各メソッドをオーバーライドするだけでは不足なのではないか、と推測出来ます。

次回のネタばらしに繋がりますが、MSDN TypeConverterクラスの説明中に、「値を変更するためにオブジェクトを再作成する必要がある型を変換するには、CreateInstance メソッドと GetCreateInstanceSupported メソッドをオーバーライドします。」とあります。つまり、これらのメソッドの実装が必要という事です。実際の実装については、次回に説明する事にします。


・余談

最後に、直接関係無かったのでここに書きますが、今回使用したMSDNの例題で、プロパティウィンドウの SpellCheckOptions のプロパティ文字列を変更すると、正しく入力しても必ずエラーが出て、設定が出来ません。下の図は、SpellCheckOptions の「入力中に確認:」の直後の True を、False に変えて、Enter キーを入れた直後の図です。

ソースを眺めると、ConvertFrom メソッドで、文字列の半角コロン":"と、半角カンマ","をサーチして、その間の文字を Boolean.Parse にて、Boolean 型に変更しています。しかし実際に文字列を表示する ConvertTo メソッドでは、終端文字として識別する筈の文字が半角カンマ","ではなく、全角句点"、"になっています。これでは、エラーが出て当然です。つまり、例題自体にバグがあります。ここを修正しないと正しく動きません。

« 構造体/クラスプロパティを展開可能にする(2) | トップページ | 構造体/クラスプロパティを展開可能にする(4)[最終回] »

C#研究」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 構造体/クラスプロパティを展開可能にする(3):

« 構造体/クラスプロパティを展開可能にする(2) | トップページ | 構造体/クラスプロパティを展開可能にする(4)[最終回] »