WPFを用いた開発をしている上で、既存のコントロールのプロパティの項目では足りなくなることがあると思います。
ここでは簡単にコントロールのプロパティを拡張する方法を紹介しようと思います。
添付プロパティ
コントロールのプロパティを拡張するには「添付プロパティ」という機能を利用します。
詳細については多くの方のブログ等にて説明されているので、ここでは割愛させていただきます。
プロパティ拡張クラスの作成
まずは、プロジェクトを作成します。今回はPrism Blank Appで作成しました。
次に「ExtendProperties」というクラスを作成しました。
ExtendProperties.cs
using System.Windows;
namespace ExtendProperty
{
public class ExtendProperties
{
[System.ComponentModel.Category(nameof(ExtendProperties))]
[System.Windows.AttachedPropertyBrowsableForType(typeof(System.Windows.Controls.TextBox))]
public static string GetTitle(DependencyObject obj)
{
return (string)obj.GetValue(TitleProperty);
}
[System.ComponentModel.Category(nameof(ExtendProperties))]
[System.Windows.AttachedPropertyBrowsableForType(typeof(System.Windows.Controls.TextBox))]
public static void SetTitle(DependencyObject obj, string value)
{
obj.SetValue(TitleProperty, value);
}
// Using a DependencyProperty as the backing store for Title. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TitleProperty =
DependencyProperty.RegisterAttached("Title", typeof(string), typeof(ExtendProperties), new PropertyMetadata(default(string)));
}
}
ExtendoPropertiesクラスには「Title」という添付プロパティを作成しました。
添付プロパティを作成する際にはコードスニペットの「propa」から作成しましょう。
また、ポイントとしてはプロパティのSetter, Getterに属性を付与しています。
こちらについては後ほど説明します。
拡張プロパティの確認
続いて先ほど作成した添付プロパティに値を設定できるか確認しましょう。
その前に、拡張プロパティの属性(Attribute)について確認しましょう。
先ほどのTitleプロパティのSetter, Getterには「CategoryAttribute」と「AttachedPropertyBrowsableForTypeAttribute」属性を付与しています。
「CategoryAttribute」は、デザイナに表示するプロパティのカテゴリを指定します。
「AttachedPropertyBrowsableForTypeAttribute」は、添付プロパティを表示するコントロールの型を指定しています。
※AttachedPropertyBrowsableForTypeAttributeは複数指定可能です。
今回はTextBoxに対して表示するようにしているので、MainWindowのGridにTextBoxを追加し、
TextBoxのプロパティをデザイナ上で確認してみます。
プロパティに「ExtendProperties.Title」が追加されています。
プロパティ上から、項目に値を入力するとコード上では下記のようになりました。
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
xmlns:ExtendProperty="clr-namespace:ExtendProperty" x:Class="ExtendProperty.Views.MainWindow"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525" >
<Grid>
<TextBox ExtendProperty:ExtendProperties.Title="タイトル"/>
</Grid>
</Window>
まとめ
今回はコントロールのプロパティの拡張方法について紹介しました。
別の方の記事でも添付プロパティについての説明はあったのですが、実際の利用方法については見つけにくかったため今回の内容を掲載しました。
また、前回はDynamicObjectを用いたバインドを紹介させていただきました。
https://qiita.com/jakucho0926/items/7fbab51a2f7dbeb2d5ec
次回は、今回と前回の内容をふまえ、現実的な実装方法について掲載していこうと思います。
※記事の埋め込みについて、いい方法がありましたら教えていただけると助かります・・・。
2022/03/14 追記
現実的な実装方法について投稿いたしました。
https://qiita.com/jakucho0926/items/070d43d015312a6042ee