質問: C#のPropertyGridに表示される項目名を多言語対応するために 外から動的に変更したいと考えております。 以下のようにプロパティの属性でハードコーディングすれば 変更できることはわかっていますが、こうすると固定になってしまうため、 指定したキーでリソース変換してその値をPropertyGridの項目名に表示できれば と考えております。.NET Frameworkは4.7.2です。 ``` [Category("Test")] [DisplayName("Test Property")] public string TestProperty {get;set;} ```
回答: コメントで紹介した記事がそれぞれ微妙に違った独自の方法で実現していますが、そのいずれも既存の属性やクラスを実装・継承して目的の機能を持つ属性やクラスを作成し、それによって表示の切り替えを実現しているようです。 質問の内容からすると一番近いのが`Globalized Property Grid`で、その次が`C#でコスパの良いデータダンプ方法(メインページ) 書きかけ`でしょうか。 それぞれの記事で以下のような内容になっていると思われます。 Globalized Property Grid * `ICustomTypeDescriptor`を実装して`GlobalizedObject`クラスを作成 * `PropertyDescriptor`を継承して`GlobalizedPropertyDescriptor`クラスを作成 * 言語とクラス毎にアセンブリリソースファイルを定義して追加 * `DisplayName`をオーバーライドしてリソースに格納した文字列を`CurrentUICulture`に応じて選択して取得する処理を作成 C#でコスパの良いデータダンプ方法(メインページ) 書きかけ プロパティ名に別名を付けて切り替えたい * `DisplayNameAttribute`を継承して`DisplayMultiNameAttribute`クラスを作成 * `PropertyGrid`を継承して`CustomPropertyGrid`クラスを作成、言語切り替え機能を追加 * アプリケーションのプロパティ定義に`DisplayMultiNameAttribute`を設定 * `DisplayMultiNameAttribute`の`UseSecondName`で言語切り替え 両方ともサンプルソースやデモがあるので、それを元に試してみてはどうでしょう? こちらは動的に変更するのではなく質問と同様に静的にカスタマイズする方法のようです。 PropertyGridコントロールに表示されるプロパティ名を変更するには? * `Attribute`を継承して`PropertyDisplayNameAttribute`クラスを作成 * `TypeConverter`を継承して`PropertyDisplayConverter`クラスを作成 * `PropertyDescriptor`を継承して`PropertyDisplayPropertyDescriptor`クラスを作成、DisplayNameをカスタマイズ * 上記で作成したクラスでクラスやDisplayNameを定義