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 문서를 참고하세요.