인터셉터 기반 바인딩 경로와 INPC·INCC 바인딩 소스

MewUI 0.20.0에서는 소스 생성기를 이용한 바인딩 경로 지정과 두 가지 새로운 바인딩 소스인 INotifyPropertyChanged(INPC) 및 INotifyCollectionChanged(INCC)를 지원합니다.

기존처럼 .Then(...).Then(...)으로 경로를 직접 연결하지 않고, 속성을 따라가는 람다 하나로 전체 경로를 지정할 수 있습니다. (Avalonia의 Compiled Binding 유사 개념)

label.Bind(Label.TextProperty, viewModel, x => x.CurrentUser.Profile.DisplayName);
label.Bind(Label.TextProperty, viewModel, x => x.Lines[0].ProductName);

바인딩 경로

소스 생성기는 람다를 일반 C# 코드로 변환합니다. 속성 이름을 바꾸면 바인딩도 함께 변경되며, 문자열 경로와 리플렉션, 식 트리를 사용하지 않아 NativeAOT 및 전체 트리밍 환경에서도 동작합니다.

양방향 바인딩에 필요한 setter도 자동으로 생성합니다.

// TextBox.Text의 기본 모드는 TwoWay입니다.
textBox.Bind(TextBox.TextProperty, viewModel, x => x.Query);

중간 객체가 교체되면 이후 경로를 다시 구독합니다. 중간 값이 null이거나 컬렉션 인덱스가 범위를 벗어나면 fallbackValue를 사용하고, 값이 다시 유효해지면 바인딩도 갱신됩니다.

식에 쓸 수 있는 것

요소 예
멤버 접근 x.Customer.City
널 조건 접근 x.Customer?.City
널 허용 억제 x.Customer!.City
캐스트 ((OrderViewModel)x.DataContext).Total
as 변환 (x.DataContext as OrderViewModel).Total
상수 인덱서 x.Lines[0].ProductName

계산식은 convert 델리게이트로 전달해야 하며, 유효하지 않은 경로는 MEWG001 컴파일 오류로 보고됩니다.

INPC와 INCC 바인딩 소스

소스 관찰하는 알림
INotifyPropertyChanged 객체의 속성 PropertyChanged
INotifyCollectionChanged 컬렉션의 인덱서 CollectionChanged

두 소스는 ObservableValue<T> 및 MewProperty<T>와 하나의 경로에서 함께 사용할 수 있습니다. 모든 구독은 약한 참조를 사용하므로 바인딩 소스가 UI 요소의 수명을 불필요하게 연장하지 않습니다.

변경 알림이 없는 일반 속성도 경로에 포함할 수 있지만 해당 단계의 변경은 관찰하지 않으며, 앞 단계가 다시 구성될 때만 값을 다시 읽습니다.

SDK 및 호환성

한 줄 경로 지정에는 .NET 9 이상 SDK가 필요합니다. 대상 프레임워크가 net8.0이어도 최신 SDK로 빌드하면 사용할 수 있습니다. .NET 8 SDK에서는 기존의 명시적 Then 체인을 사용해야 하지만 동작은 같습니다.

  • 기존 ObservableValue<T>, MewObject 속성 바인딩, 명시적 Then 체인의 동작과 시그니처는 바뀌지 않습니다.
  • 사용되지 않던 공개 타입인 BindingSource<T>는 제거했습니다.
  • 명시적 체인과 진단에 대한 자세한 내용은 Binding 문서를 참고하세요.
4개의 좋아요