페이커 WPF-3(Inotify Property Changed 사용에 대한 생각)
16102 단어 property
일반적으로 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의 코드가 실현되는 것을 많이 보아라.외국인이 쓴 것은 확실히 영성이 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python 특수 속성property 원리 및 사용 방법 분석1 특성 속성 property는 특수한 속성입니다. 접근할 때 기능 (함수) 을 실행하고 값을 되돌려줍니다. 주의: 이 때의 특성arear와perimeter는 값을 부여할 수 없습니다 2 왜 프로퍼티를 써? 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.