FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

依存関係プロパティ

 アクションやビヘイビア、ユーザーコントロールには独自のプロパティを持たせることができます。
 この時、通常のプロパティ(CLRプロパティと言われることもあります)だとデータバインディングができません。
 (XAMLで値を指定することはできます)
 データバインディングも可能なプロパティにするためには依存関係プロパティでプロパティを定義する必要があります。
 依存関係プロパティを作る場合は、コードスニペット「propdp」を使用すると便利です。
 以下のコードはコードスニペット「propdp」を使用して「Text1」という名前のプロパティを作成したときのコードです。
// 使いやすいようにCLRプロパティも定義する。
public string Text1
{
    get { return (string)GetValue(Text1Property); }
    set { SetValue(Text1Property, value); }
}

// こちらが依存関係プロパティの定義。
public static readonly DependencyProperty Text1Property =
    DependencyProperty.Register(
    "Text1",                    // プロパティ名
    typeof(string),             // プロパティの型
    typeof(UserControl1),       // 定義されているクラスの型(このクラスの型)
    new PropertyMetadata(""));  // メタデータ(初期値のみ指定)
 DependencyProperty.Registerメソッドで定義されている方が依存関係プロパティです。
 Registerメソッドには、プロパティ名、プロパティの型、定義されているクラスの型、メタデータを指定します。
 このうち、メタデータでは初期値や値が変更された際のコールバックの設定等が行えます。
 コードスニペットで作成されるメタデータは初期値のみ指定しています。
 PropertyMetadataではなくFrameworkPropertyMetadataを使用することでデータバインディングの初期設定を行うこともできます。
 このコードでは、値が変更された際のコールバックを設定していないので処理に使用するデータを受け取るだけになります。
 プロパティの値が変更された際にUIの変更等を行いたい場合は、値が変更された際のコールバックを指定する必要があります。
 依存関係プロパティと一緒に通常のプロパティも定義されています。これは、通常のプロパティも定義しておいた方が使いやすいからです。(必須ではありません)
 通常プロパティのセッターで値の変更時の処理は行わないでください。通常プロパティのセッターを経由せずに値が変更されたときに値の変更処理が行われないからです。

 以下のサンプルコードは依存関係プロパティTextを変更するとUIに指定した文字列を表示するユーザーコントロールです。
using System.Windows;
using System.Windows.Controls;

namespace DpProperty.Views
{
    /// <summary>
    /// UserControl1.xaml の相互作用ロジック
    /// </summary>
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        #region Text
        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), 
            new FrameworkPropertyMetadata( // メタデータ
                "",                                                     // 初期値
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,  // 双方向バインディングを規定とする
                new PropertyChangedCallback(OnTextChanged)));           // 値が変更されたときのコールバック
        #endregion

        // Text2が変更された際の処理
        private static void OnTextChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            var userControl = obj as UserControl1;
            if (userControl == null) return;

            var newValue = (string)e.NewValue;
            userControl.TextBlock.Text = newValue;
        }
    }
}
 Textプロパティを依存関係プロパティで作成します。
 このTextプロパティでは、データバインディングを双方向にし、値が変更された際にUIを変更するようにしています。
 データバインディング設定を変更したい場合はFrameworkPropertyMetadataを使用します。
 値が変更された際のコールバックはPropertyChangedCallbackで指定します。
 プロパティの値はDependencyPropertyChangedEventArgsのeから取得できます。このイベント変数には古い値と新しい値が格納されています。
 ここでは、ユーザーコントロールのTextBlock(という名前のTextBlock)のTextプロパティに変更された値を代入しています。
 こんな感じで、プロパティ変更時のコールバックでUIの変更等を行います。

スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

カレンダー
10 | 2018/11 | 12
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
全記事表示リンク

全ての記事を表示する

カテゴリ
タグリスト

月別アーカイブ
11  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09 
最新記事
リンク
最新コメント
検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。