[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);
struct를 class로 변경해주면 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}"
- class일 경우,
최초 CollectionView
의 SelectedItem
은 null일 것이고 (object이므로)
MainPageViewModel의 바인딩 될 SelectedItem
속성은 아무런 값을 할당하지 않았으므로 null
이 되며
null에서 null을 대입하므로 CollectionView는 아이템이 변경되지 않았다고 판단하여
SelectionChanged
이벤트가 발생하지 않습니다.
- 이에 반하여 struct일 경우,
MainPageViewModel의 SelectedItem
은 null이 아니라 RecordStruct
의 기본값이 됩니다. 구조체의 기본 값은 null이 아닙니다.
null에서 null이 아닌 값이 대입되므로 CollectionView
은 아이템이 변경되었다고 판단합니다.
class와 struct의 동작 방식의 차이를 이해한 후 문제의 원인을 좁혀서 접근하면 어렵지 않게 원인을 파악할 수 있습니다.
SelectionChanged
이벤트가 발생하는 시점
- 바인딩된 아이템이 변경되었을 경우
- 화면 목록에서 아이템이 선택된 경우
-
바인딩 된 속성의 읽기 시점 확인
-
원인 파악
6개의 좋아요
감사합니다.
SelectedItem
는 초기 값이 null이며
struct
는 기본 값을 가집니다.
그래서 SelectedItem에 struct 객체를 바인딩하면 null에서 default value로 변경되어
SelectedItem event
가 raise 되는 거군요.
++ Property
에 중단점이 찍히는 것은 처음 알았네요.
답변 감사합니다.
6개의 좋아요