XAML UI 플랫폼별 C# 인덱서 바인딩의 PropertyChanged 이벤트 반응 비교

전에 C#의 인덱서를 이용해서 WPF View에 바인딩을 해야 할 상황이 있었습니다.
예를 들면 이렇습니다.

public class DataTags : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;

    public DataTag this[string key]
    {
        get
        {
            ...
        }
        set
        {
            ...
        }
    }
}
<!-- PCS.PCS1.Power의 값을 TextBlock에 표시 -->
<TextBlock Text="{Binding DataTags[PCS.PCS1.Power].Value}"/>

<!-- PCS.PCS1.HeavyFault 값에 따라 빨간색 원 표시 여부 결정 -->
<Ellipse Fill="Red" Width="20" Height="20"
    Visibility="{Binding DataTags[PCS.PCS1.HeavyFault].Value, Converter={StaticResource VisibilityConverter}"/>

여기서 특정 string key에 대한 내용이 변경되었을 경우, WPF에서는 "Item[]"PropertyChangedEventArgs의 생성자 매개변수로 사용하여 View에 변경 통지를 할 수 있다고 알고 있었습니다. 물론, 키 정보를 담고 있지 않기 때문에 모든 인덱서를 통한 바인딩들이 한꺼번에 PropertyChanged 이벤트를 수신하게 되어 그리 좋은 개발 패턴은 아닙니다.

그런데 Avalonia UI에서는 이벤트 매개변수 생성 방법이 조금 달랐습니다.

"Item[]"이 아니라 "Item"을 사용해야 한다고 합니다.

그래서 다른 XAML 기반 UI 플랫폼들은 어떤 것을 사용해야 하나 궁금해서 일일이 테스트를 해보고 그 결과를 블로그에 기록했습니다.

WinUI 3, MAUI, Uno Platform은 $"Item[{key}]"의 형식으로 이벤트를 발생 시킬수 있다는 점이 조금 놀라웠네요. ㅎㅎ

그리고 new PropertyChangedEventArgs(string.Empty)를 사용하면 모든 속성에 변화가 생긴 것으로 간주하는 것으로 알고 있었는데, 인덱서 바인딩에서는 반응을 하지 않는 경우도 발견되었습니다.

잘 사용되지 않는 개발 패턴이지만, 혹시나 인덱서로 바인딩을 해야 할 경우에 참고하시면 좋을 것 같습니다.

9 Likes