2016-10-04 4 views
0

MVVM 아키텍처에서 일부 코드를 리팩토링하려고합니다.
모델에 직접 변경되는 공개 값이 있습니다.MVVM의 모델에서 뷰로의 속성 변경을 정의하는 가장 좋은 방법은 무엇입니까?

UI는 이러한 값의 변경을 수신 대기합니다.

다음
public string LoadFilename { get { return _loadFilename; } set { _loadFilename = value; OnPropertyChanged(); } } 
public string SaveFilename { get { return _saveFilename; } set { _saveFilename = value; OnPropertyChanged(); } } 
public string OneSafFilename { get { return _oneSafFilename; } set { _oneSafFilename = value; OnPropertyChanged(); } } 

public bool IsSaveEnabled   { get { return _isSaveEnabled;   } set { _isSaveEnabled   = value; OnPropertyChanged(); } } 
public bool IsLoadEnabled   { get { return _isLoadEnabled;   } set { _isLoadEnabled   = value; OnPropertyChanged(); } } 
public bool IsLoadCheckpointEnabled { get { return _isLoadCheckpointEnabled; } set { _isLoadCheckpointEnabled = value; OnPropertyChanged(); } } 
public bool IsCheckpointEnabled  { get { return _isCheckpointEnabled;  } set { _isCheckpointEnabled  = value; OnPropertyChanged(); } } 
public bool IsScenariosEnabled  { get { return _isScenariosEnabled;  } set { _isScenariosEnabled  = value; OnPropertyChanged(); } } 

OnPropertyChanged 기능입니다 :

public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

이 MVVM 자연해야 뭔가 상용구의 많은 것 같다

은 아래 이벤트 신호 코드입니다.
좀 더 간결하게하고 싶지만 어디서부터 시작해야할지 모르겠습니다.

위의 속성을 수신하는보기에서 getters와 setter는 어떻게 생겼을 까?

+0

@HenkHolterman에 전적으로 동의합니다. INPC 구현을 기본 클래스로 옮길 수 있습니다. 다음은 이전에 사용한 작은 예제입니다. http://stackoverflow.com/questions/33801100/where-i-need-to-define-inotifypropertychanged-in-case-of-base-and-sub-classes/33805183# 33805183 – Ilan

+0

먼저, derp ('PropertyChanged? .Invoke (...)')를 줄이는 언어 기능을 잊지 마라. 둘째, 타입 디스크립터를 사용하는 T4 템플릿의 보일러 플레이트로부터 이런 상황을 개선 할 수있는 많은 방법이있다. IDynamicMetaObjectProviders 등에서 POCO를 래핑하는 것입니다. – Will

답변

3

INPC 구현은 항상 WPF/XAML의 추악한 부분으로 남아 있습니다. 좋은 기본 클래스를 사용하면 { get { return _loadFilename; } set { Set(ref _loadFilename, value); } }으로 줄일 수 있지만 그만큼 컴팩트합니다. Resharper는 이것을 (리팩토링) 지원합니다.

Btw, 귀하의 코드에도 최적화 가드 if(value != _loadFilename)이 누락되었습니다. 따라서 BindableBase 기본 클래스는 확실히 좋은 아이디어입니다.

2

Fody's PropertyChanged과 같이 변경 알림 코드를 삽입하기 위해 빌드 타임에 IL을 다시 쓰는 것이 좋습니다.

-1
private type m_name; 
    public type name 
    { 
     get { return m_name; } 
     set 
     { 
      m_name = value; 
      if (PropertyChanged != null) 
      { PropertyChanged(this, new PropertyChangedEventArgs("name")); } 
     } 
    } 

위의 코드는 수신기를 필요로하는 속성 변경에 사용됩니다. type은 속성의 유형이고 name은 속성의 이름입니다 (코드에서 볼 수있는 'type'및 'name'변경)

속성 변경 및 코드 스 니펫에 대해 자세히 설명하는 MVVM에 대한 훌륭한 자습서를 보려면, YouTube에서 Jerry Nixon을 확인하십시오. https://www.youtube.com/watch?v=cB7KdYPQw1k 조금 오래되었지만 여전히 도움이됩니다.

+0

따옴표 안에 "이름"을 사용하는 것은 원래 코드의 뒤로 한 단계 진화합니다. 그리고 이것은 더 길다. OnPropertyChange() 메서드는 권장되는 패턴에 속합니다. –

+0

행운을 빌어 요 ... – Ag71191

관련 문제