수색…


비고

INotifyPropertyChanged 인터페이스는 클래스에서 속성에 발생하는 변경 사항을보고해야 할 때마다 필요합니다. 인터페이스는 단일 이벤트 PropertyChanged 정의합니다.

XAML 바인딩을 사용하면 PropertyChanged 이벤트가 자동으로 연결되므로보기 모델 또는 데이터 컨텍스트 클래스에 INotifyPropertyChanged 인터페이스를 구현하기 만하면 XAML 바인딩을 사용할 수 있습니다.

C # 6에서 INotifyPropertyChanged 구현하기

INotifyPropertyChange 의 구현은 인터페이스에서 속성 이름을 문자열로 지정해야하므로 오류가 발생할 수 있습니다. 구현을보다 강력하게하기 위해서 (때문에), 속성 CallerMemberName 사용할 수 있습니다.

class C : INotifyPropertyChanged
{
    // backing field
    int offset;
    // property
    public int Offset
    {
        get
        {
            return offset;
        }
        set
        {
            if (offset == value)
                return;
            offset = value;
            RaisePropertyChanged();
        }
    }

    // helper method for raising PropertyChanged event
    void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    // interface implemetation
    public event PropertyChangedEventHandler PropertyChanged;
}

INotifyPropertyChanged 구현하는 클래스가 여러 개있는 경우 인터페이스 구현을 리팩터링하고 공통 기본 클래스에 도우미 메서드를 유용하게 사용할 수 있습니다.

class NotifyPropertyChangedImpl : INotifyPropertyChanged
{
    protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    // interface implemetation
    public event PropertyChangedEventHandler PropertyChanged;
}

class C : NotifyPropertyChangedImpl
{
    int offset;
    public int Offset
    {
        get { return offset; }
        set { if (offset != value) { offset = value; RaisePropertyChanged(); } }
    }
}

일반 Set 메서드로 INotifyPropertyChanged

아래의 NotifyPropertyChangedBase 클래스는 파생 된 유형에서 호출 할 수있는 일반 Set 메서드를 정의합니다.

public class NotifyPropertyChangedBase : INotifyPropertyChanged
{
    protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    
    public event PropertyChangedEventHandler PropertyChanged;

    public virtual bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
    {
        if (Equals(field, value))
            return false;
        storage = value;
        RaisePropertyChanged(propertyName);
        return true;
    }
}

이 일반 Set 메서드를 사용하려면 NotifyPropertyChangedBase에서 파생되는 클래스를 만들어야합니다.

public class SomeViewModel : NotifyPropertyChangedBase
{
    private string _foo;
    private int _bar;

    public string Foo
    {
        get { return _foo; }
        set { Set(ref _foo, value); }
    }

    public int Bar
    {
        get { return _bar; }
        set { Set(ref _bar, value); }
    }
}

위에 표시된 것처럼 Set(ref _fieldName, value); 호출 할 수 있습니다 Set(ref _fieldName, value); 속성의 설정자가 필요하면 PropertyChanged 이벤트를 자동으로 발생시킵니다.

그런 다음 속성 변경을 처리해야하는 다른 클래스의 PropertyChanged 이벤트에 등록 할 수 있습니다.

public class SomeListener
{
    public SomeListener()
    {
        _vm = new SomeViewModel();
        _vm.PropertyChanged += OnViewModelPropertyChanged;
    }

    private void OnViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        Console.WriteLine($"Property {e.PropertyName} was changed.");
    }

    private readonly SomeViewModel _vm;

}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow