【MVVM】 コード・ビハインド(C#コード)で、ビヘイビア(Behavior)を設定するには

◆ C# Code

//<i:Interaction.Behaviors>
//    <localInteractivity:InvokeMethodBehavior 
// Target="{Binding DataContext, ElementName=Self}" MethodName="CreateUser"/>
//</i:Interaction.Behaviors>
var action = new System.Windows.Interactivity.InvokeCommandAction();
var methodBehavior = new Actions.InvokeMethodBehavior(); // Behavior
methodBehavior.MethodName = "CreateUser";
methodBehavior.Attach(button1);
System.Windows.Interactivity.Interaction.GetBehaviors(button1)
    .Add(methodBehavior);

◆ Behavior

using System;
using System.Windows;
using System.Windows.Controls;
// Expression Blend SDKをインストールし、
// System.Windows.Interactivity.dll を参照設定
// http://www.microsoft.com/downloads/ja-jp/details.aspx?displaylang=ja&FamilyID=d197f51a-de07-4edf-9cba-1f1b4a22110d
using System.Windows.Interactivity;
using System.Reflection;
using System.ComponentModel.Composition;

namespace Actions
{
    public class InvokeMethodBehavior : Behavior<UserControl>
    {
        public InvokeMethodBehavior()
        {
        }

        private static readonly DependencyProperty TargetProperty =
           DependencyProperty.Register("Target", typeof(object), 
               typeof(InvokeMethodBehavior), null);

        public object Target
        {
            get { return (object)GetValue(TargetProperty); }
            set { SetValue(TargetProperty, value); }
        }

        public string MethodName { get; set; }

        // 要素にアタッチされたときの処理。
        protected override void OnAttached()
        {
            base.OnAttached();
            this.AssociatedObject.LoadedNext += LayoutRootLoaded;
        }

        // 要素にデタッチされたときの処理。
        protected override void OnDetaching()
        {
            base.OnDetaching();
            this.AssociatedObject.LoadedNext -= LayoutRootLoaded;
        }
        
        // LayoutRootLoaded 時に実行されるメソッド。
        private void LayoutRootLoaded
            (object sender, EventArgs e)
        {            
            object InvokeObj;
            Type targetType;
            
            if (this.Target != null)
            {
                targetType = this.Target.GetType();
                InvokeObj = this.Target;
            }
            else
            {
                var root = this.AssociatedObject.Content as FrameworkElement;

                if (root == null)
                {
                    throw new ArgumentNullException("root");
                }
                else if (root.DataContext == null)
                {
                    throw new ArgumentNullException("DataContext");
                }

                targetType = root.DataContext.GetType();
                InvokeObj = root.DataContext;
            }

            if (string.IsNullOrWhiteSpace(this.MethodName))
            {
                throw new ArgumentNullException("MethodName");
            }

            MethodInfo method = targetType.GetMethod(this.MethodName
                , BindingFlags.Public | BindingFlags.Instance);
            
            if (method == null)
            {
                throw new InvalidOperationException
                    (String.Format("TargetMethodNotFound", this.MethodName));
            }

            method.Invoke(InvokeObj, null);
        }
    }
}

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中