> 백엔드 개발 > C++ > 속성 값 변경 알림을 위해 INotifyPropertyChanged를 안전하게 구현하는 방법은 무엇입니까?

속성 값 변경 알림을 위해 INotifyPropertyChanged를 안전하게 구현하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-30 13:51:10
원래의
249명이 탐색했습니다.

How to Safely Implement INotifyPropertyChanged for Property Value Change Notifications?

이벤트를 사용하여 속성 값 변경을 알리는 방법

속성 값 변경을 관찰하려면 PropertyChanged 이벤트가 포함된 INotifyPropertyChanged 인터페이스를 활용할 수 있습니다. . 소비자는 이 이벤트를 구독하여 특정 속성의 변경 사항을 감지할 수 있습니다.

public interface INotifyPropertyChanged
{
    event PropertyChangedEventHandler PropertyChanged;
}
로그인 후 복사

이벤트를 사용한 INotifyPropertyChanged의 안전한 구현

Richard의 이전 응답에서는 안전하지 않은 구현이 도입되었습니다. , 스레드 안전성을 보장하는 개정 버전은 다음과 같습니다.

public class MyClass : INotifyPropertyChanged
{
    private string imageFullPath;

    protected void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, e);
    }

    protected void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

    public string ImageFullPath
    {
        get { return imageFullPath; }
        set
        {
            if (value != imageFullPath)
            {
                imageFullPath = value;
                OnPropertyChanged("ImageFullPath");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}
로그인 후 복사

이것은 구현:

  • 여러 속성에 쉽게 적용할 수 있도록 속성 변경 알림 방법을 중앙 집중화합니다.
  • PropertyChanged 대리자의 복사본을 만들어 경쟁 조건을 방지합니다.
  • 준수 INotifyPropertyChanged에 완전히 적용됨 인터페이스.

추가 특정 속성 변경 이벤트

추가 세부성을 위해 다음과 같이 특정 속성에 대해 별도의 이벤트를 정의할 수 있습니다.

protected void OnImageFullPathChanged(EventArgs e)
{
    EventHandler handler = ImageFullPathChanged;
    if (handler != null)
        handler(this, e);
}

public event EventHandler ImageFullPathChanged;
로그인 후 복사

속성 setter에서 일반 OnPropertyChanged 이벤트와 특정 OnImageFullPathChanged를 모두 호출합니다. event.

속성 이름 획득 단순화(C# 4.5 전용)

마지막으로 C# 4.5 이상의 경우 CallerMemberAttribute를 활용하여 자동으로 속성 이름을 추출하므로 필요가 없습니다. 수동 문자열 리터럴의 경우:

protected void OnPropertyChanged(
        [System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }
로그인 후 복사

위 내용은 속성 값 변경 알림을 위해 INotifyPropertyChanged를 안전하게 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿