페이커 WPF-3(Inotify Property Changed 사용에 대한 생각)

16102 단어 property
WPF의 사용은 모두 이 인터페이스와 떨어질 수 없다.이 인터페이스는 View 모델의 데이터가 변할 때 프론트 데스크톱 페이지를 알리는 기능을 실현한다.
일반적으로 ViewModel은 이렇게 쓰여집니다.Look:아래 코드
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.ComponentModel;



namespace WpfApplication4

{

    public class DemoViewModel:INotifyPropertyChanged

    {

        #region << Property >>

        public event PropertyChangedEventHandler PropertyChanged;



        private string name = string.Empty;

        public string Name

        {

            get { return name; }

            set

            {

                if (name != value)

                {

                    name = value;

                    Notify("Name");

                }

            }

        }

        #endregion



        #region << Method >>

        public void Notify(string propertyName)

        {

            if (PropertyChanged != null)

                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

        }

        #endregion

    }

}

위의 코드는 감각에 따라 쓴 것으로 실제 디버깅을 한 적이 없지만 보통 이런 식으로 쓴다.
두 번째 쓰기 prism:
Lambda Expression을 공교롭게 사용했습니다.(정말 괜찮다)
1. 추상 클래스 NotifyObject 클래스 캡슐화
주로 Notify 메소드가 캡슐화됩니다(Lambda Expression 사용)
protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression)

        {

            var propertyName = PropertySupport.ExtractPropertyName(propertyExpression);

            this.RaisePropertyChanged(propertyName);

        }
 public static string ExtractPropertyName<T>(Expression<Func<T>> propertyExpression)

        {

            if (propertyExpression == null)

            {

                throw new ArgumentNullException("propertyExpression");

            }



            var memberExpression = propertyExpression.Body as MemberExpression;

            if (memberExpression == null)

            {

                throw new ArgumentException(Resources.PropertySupport_NotMemberAccessExpression_Exception, "propertyExpression");

            }



            var property = memberExpression.Member as PropertyInfo;

            if (property == null)

            {

                throw new ArgumentException(Resources.PropertySupport_ExpressionNotProperty_Exception, "propertyExpression");

            }



            var getMethod = property.GetGetMethod(true);

            if (getMethod.IsStatic)

            {

                throw new ArgumentException(Resources.PropertySupport_StaticExpression_Exception, "propertyExpression");

            }



            return memberExpression.Member.Name;

        }

ExtracPropertyName의 유일한 목적은 Lambda Expression을 해석하는 것입니다.속성 이름을 가져옵니다.
prism의 사용은 이렇습니다.
(수동으로 쓰기, 컴파일하지 않음)
private string name = string.Empty;
public string Name
{
  get { return name;}
  set
  {
    name = value;
    RaisePropertyChanged(()=>Name);
  }
}
이 방법을 사용하려면 추상 클래스 Notify Object를 상속해야 합니다.
 
방법3: 오기 전에 개발하고 코드 프로젝트를 볼 때 자신의 생각: Look
먼저 사용하는 코드를 보십시오
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Input;



namespace WpfApplication4

{

    public class MainWindowsViewModel:NotifyObject

    {

        #region << Property >>

        public string Name

        {

            get { return GET(() => Name); }

            set { SET(() => Name, value); }

        }



        public string ButtonName

        {

            get { return GET(() => ButtonName); }

            set { SET(() => ButtonName, value); }

         }



        public ICommand DemoClick { get; set; }

        #endregion



        #region << Constructor >>

        public MainWindowsViewModel()

        {

            DemoClick = new DeletegateCommand(DemoMethod);

        }

        #endregion



        #region << Method >>

        public void DemoMethod()

        {

           // MessageBox.Show("Demo CheckBox Click");

            Name = "Notify";

            ButtonName = "NotifyButton";

        }



        public bool CanDemoMethod()

        {

            return false;

        }

        #endregion



    }

}

이어서 실현을 보자(간단한 실현)
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.ComponentModel;

using System.Linq.Expressions;



namespace WpfApplication4

{

    public abstract class NotifyObject:INotifyPropertyChanged

    {

        #region << Field >>

        private object notifyObj = null;

        #endregion



        #region << Property >>

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion



        #region << Method >>

        public T GET<T>(Expression<Func<T>> express)

        {

            if (notifyObj == null)

                return default(T);

            else

                return (T)notifyObj;

        }



        public void SET<T>(Expression<Func<T>> express, object obj)

        {

            var memExpress = (MemberExpression)express.Body;



            if (memExpress == null)

                throw new Exception("The expression is valid");



            if (!Object.ReferenceEquals(notifyObj, obj))

            {

                var propertyName = memExpress.Member.Name;

                if (!string.IsNullOrEmpty(propertyName))

                {

                    notifyObj = obj;

                    Notify(propertyName);

                }

            }

        }



        private void Notify(string propertyName)

        {

            if (PropertyChanged != null)

                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

        }

        #endregion

    }

}

이 방법의 가장 큰 문제는 모든 속성이 자신의 사본을 가지고 있는데 실제로는 두 부이다.이것은 메모리를 소모하게 할 것이다.
두 번째 문제는 Object box & unbox의 성능 손실이다.
세 번째 문제는 Lambda Expression의 성능 손실을 분석하는 것이다.
일반적인 사용에 대해서는 영향이 크지 않을 것으로 보인다.
그렇게 지도 모른다, 아마, 아마...좋은 생각이 있는 건 좋은데.이렇게 쓰면 코드를 아름답게 할 수 있다.
나는 여전히 WPF를 만드는 것을 제안한다. prism의 코드가 실현되는 것을 많이 보아라.외국인이 쓴 것은 확실히 영성이 있다.
 

좋은 웹페이지 즐겨찾기