[MAUI] Selected_Change event가 Page가 열릴 때도 raise됩니다.

[Android]

public record struct CollectionViewItem(name : string name);
<CollectionView 
  ItemsSource="{Binding CollectionViewItem}"
  SelectionChanged="CollectionView_SelectionChanged">

record struct를 ItemSource로 바인딩하면 page가 열릴 때에도 raise됩니다.
(OnAppearing Event를 합쳐 놓은 느낌이네요)

public record class CollectionViewItem(name : string name);

structclass로 변경해주면 event가 정상적으로 작동합니다.

record struct 객채를 바인딩했을 때 왜 이런 현상이 나는 걸까요?

GitHub Sample
Record 문서

2개의 좋아요

struct와 class의 차이점 때문입니다.

3개의 좋아요

이해가 잘 안됩니다.

SelectedChangeEvent가 어떻게 인식해서 raise하는지 궁금합니다만, 해당 class를 보면 별 내용이 없습니다…

struct에 관련된 내용을 보아도 Event에 영향을 줄 수 있는지 감이 안 잡힙니다.

https://www.c-sharpcorner.com/blogs/difference-between-struct-and-class-in-c-sharp

2개의 좋아요

XAML에서

SelectedItem="{Binding SelectedItem}"
  1. class일 경우,

최초 CollectionViewSelectedItem은 null일 것이고 (object이므로)
MainPageViewModel의 바인딩 될 SelectedItem 속성은 아무런 값을 할당하지 않았으므로 null이 되며

null에서 null을 대입하므로 CollectionView는 아이템이 변경되지 않았다고 판단하여

SelectionChanged 이벤트가 발생하지 않습니다.

  1. 이에 반하여 struct일 경우,

MainPageViewModel의 SelectedItem은 null이 아니라 RecordStruct의 기본값이 됩니다. 구조체의 기본 값은 null이 아닙니다.

image

null에서 null이 아닌 값이 대입되므로 CollectionView은 아이템이 변경되었다고 판단합니다.

class와 struct의 동작 방식의 차이를 이해한 후 문제의 원인을 좁혀서 접근하면 어렵지 않게 원인을 파악할 수 있습니다.

  1. SelectionChanged이벤트가 발생하는 시점
  • 바인딩된 아이템이 변경되었을 경우
  • 화면 목록에서 아이템이 선택된 경우
  1. 바인딩 된 속성의 읽기 시점 확인

  2. 원인 파악

6개의 좋아요

감사합니다.

image

SelectedItem는 초기 값이 null이며
struct는 기본 값을 가집니다.
그래서 SelectedItem에 struct 객체를 바인딩하면 null에서 default value로 변경되어
SelectedItem event가 raise 되는 거군요.

++ Property에 중단점이 찍히는 것은 처음 알았네요.
답변 감사합니다.

6개의 좋아요