programing

변경된 속성 및 자동 속성 알림

stoneblock 2023. 5. 9. 22:02

변경된 속성 및 자동 속성 알림

사용할 수 있는 방법이 있습니까?INotifyPropertyChanged자동 속성으로?어쩌면 속성이나 다른 것일 수도 있어요, 저한테는 분명하지 않아요.

public string Demo{
    get;set;
}

나에게 자동 속성은 매우 실용적인 것이지만, 거의 항상, 나는 그것을 높여야 합니다.PropertyChanged-event 속성 값이 변경되고 이를 위한 메커니즘이 없다면 자동 속성은 나에게 쓸모가 없습니다.

.NET 4.5 이상에서는 약간 짧게 만들 수 있습니다.

private int unitsInStock;
public int UnitsInStock
{
    get { return unitsInStock; }
    set { SetProperty(ref unitsInStock, value);}
}

스스로 코드를 작성해야 할 것입니다.가장 가까운 것은 Code Project에서 사용자 지정 특성 및 측면 지향 메서드를 사용하여 다음 구문을 제공하는 이 구현과 같은 것입니다.

[NotifyPropertyChanged] 
public class AutoWiredSource
{ 
   public double MyProperty { get; set; } 
}

Microsoft Connect에서 C# 사양에 대한 변경을 제안한 적이 있습니다.

class Person : INotifyPropertyChanged
{
    // "notify" is a context keyword, same as "get" and "set"
    public string Name { get; set; notify; }
}

하지만 그 제안은 이제 마감되었습니다.

이것을 할 수 있는 내장된 메커니즘은 없습니다.PostSharp와 같은 것이 여러분을 위해 이와 같은 것을 추가할 수 있을 것입니다(또는 이 데이터 바인딩을 인식하는 데 관심이 있다면 Mark Gravell의 Hyper Descriptor).

INotifyPropertyChanged그리고 Dependency Properties는 확실히 속성을 훨씬 덜 재미있게 만들었습니다.제가 찾은 가장 좋은 해결책은 좋은 스니펫입니다.Silverlight 기부 프로젝트에 있는 것들과 같은 것들.

먼저 다음을 사용하여 다른 방법을 시도했습니다.

이러한 방법은 효과가 있지만 모델의 모든 속성에 대한 액세스 또는 메서드를 진흙으로 덮거나 사용해야 했습니다.dynamic코드화할 때 자동 변환을 중지하는 개체입니다.안타깝게도 WinForms는 동적 개체에 대한 바인딩을 지원하지 않습니다.

해결책

결국 저는 리액티브를 만났습니다.UI.포디.Fody와 Reactive를 사용한 간편한 솔루션입니다.UI. WPF 프로젝트에서 성공적으로 사용했습니다.

필요한 보일러 플레이트 코드로 짜여져 있습니다.RaisePropertyChanges그리고.ObservableAsPropertyHelper컴파일 시에

프로젝트 종속성

https://github.com/kswoll/ReactiveUI.Fody

NuGet을 사용하여 프로젝트에 다음 패키지를 설치했습니다.

<packages>
  <package id="Fody" version="2.0.7" targetFramework="net452" developmentDependency="true" />
  <package id="reactiveui" version="7.4.0" targetFramework="net452" />
  <package id="ReactiveUI.Fody" version="2.2.11" targetFramework="net452" />
  <package id="reactiveui-core" version="7.4.0" targetFramework="net452" />
  <package id="Rx-Core" version="2.2.5" targetFramework="net452" />
  <package id="Rx-Interfaces" version="2.2.5" targetFramework="net452" />
  <package id="Rx-Linq" version="2.2.5" targetFramework="net452" />
  <package id="Rx-Main" version="2.2.5" targetFramework="net452" />
  <package id="Rx-PlatformServices" version="2.2.5" targetFramework="net452" />
  <package id="Rx-XAML" version="2.2.5" targetFramework="net452" />
  <package id="Splat" version="1.6.0" targetFramework="net452" />
</packages>

푸드 설정

프로젝트의 최상위 수준에서 FodyWeavers.xml 파일을 생성하여 다음과 같이 만들어야 합니다.

<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
  <ReactiveUI/>
</Weavers>

사용.

모델 클래스를 상속 오프로 설정하면 됩니다.ReactiveObject추가합니다.[Reactive]변경 사항을 통지할 속성 위에 있는 속성입니다.

using ReactiveUI;
using ReactiveUI.Fody.Helpers;

namespace name.domain.some{
    class SomeClass : ReactiveObject {
        [Reactive]
        public string SomeProperty { get; set; }
    }
}

잘했어요!프로젝트를 다시 빌드하고 Visual Studio의 출력 창을 확인합니다.Fody가 주석이 달린 모델 클래스를 처리하고 적절한 상용판 코드를 주입할 때 Fody에서 출력되는 일부 라인이 표시됩니다.다음과 같이 보여야 합니다.

여기에 이미지 설명 입력

추가 정보

더 유용한 정보는 여기에서 찾을 수 있습니다.

crea7or의 유용한 답변은 제 최근 프로젝트에서 사용하게 되었습니다.이를 개선하는 한 가지 방법은 다음과 같이 SetProperty를 다시 쓰는 것입니다.

protected bool SetProperty<T>(ref T storage, T value, string[] dependentPropertyNames = null, [CallerMemberName] string propertyName = null)
{
    if (Equals(storage, value))
    {
        return false;
    }

    storage = value;
    this.OnPropertyChanged(propertyName);

    if(dependentPropertyNames != null)
    {
        foreach(var dependentPropertyName in dependentPropertyNames)
        {
            OnPropertyChanged(dependentPropertyName);
        }
    }

    return true;
}

이제 독립 속성 이름을 전달할 수 있으므로 종속 속성 값이 직접 설정되지 않았지만 다른 속성이 설정된 결과로 변경되었음을 알 수 있습니다.

용도:

private string firstName;
public string FirstName
{
    get { return firstName; }
    set { SetProperty(ref firstName, value, new[] { "FullName" }); }
}

private string lastName;
public string LastName
{
    get { return lastName; }
    set { SetProperty(ref lastName, value, new[] { "FullName" }); }
}

public string FullName
{
    get { return $"{FirstName} {LastName}"; }
}

언급URL : https://stackoverflow.com/questions/3347309/inotifypropertychanged-and-auto-properties