728x90
예? 저에게 데이터가 전달되었다고요?
를 표현한 잔망루피입니다.
예전에는 WPF 개발을 MVVM 구조로 진행해서 ViewModel과 Model을 사용해서 데이터를 전달하곤 했는데, 이번에는 개발 디자인 패턴이 바뀌어서 MVC로 진행하게 되었습니다.
데이터 전달을 EventHandler라는 것을 사용하게 되는데 간단히 정리해보도록 하겠습니다.
1. EventHander 선언
public event EventHandler<string> TitleSelected;
// string 타입의 데이터를 이벤트 핸들러에 전달할 수 있음
2. EventHanlder가 사용될 이벤트 등록 및 구현
lv_Presents.SelectionChanged += Lv_Presents_SelectionChanged;
// ListView에서 항목이 변경될 때 실행되는 이벤트(Lv_Presents_SelectionChanged)를 등록
// 선택 항목이 바뀔 때마다 메서드가 호출
private void lv_Presents_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (lv_Presents.SelectedItem is PresentModel model)
{
TitleSelected?.Invoke(this, model.title);
// this: 현재 UserControl을 이벤트 발신자로 지정
// model.title: 전달할 데이터
// ?.Invoke: 이벤트 구독자에게 데이터 전달(구독자가 없을 때 예외가 발생하지 않음)
}
}
3. 이벤트 구독 및 처리로직 구현
uc_Presents.TitleSelected += uc_Presents_TitleSelected;
// uc_Presents TitleSelected 이벤트가 발생하면, uc_Presents_TitleSelected 메서드 실행
// Window가 생성될 때 이벤트 핸들러를 등록하여 UserControl에서 발생한 이벤트를 받을 준비를 함
private void uc_Presents_TitleSelected(object sender, string title)
{
tblock_SelectedTitle.Text = title;
}
💡 이벤트 해제
* 객체가 더 이상 사용되지 않거나 이벤트를 더 이상 받을 필요가 없을 때는 -=로 해제하는 것이 좋음
* 이벤트 핸들러가 해제되지 않으면 구독자가 GC에 의해 수거되지 않기 때문에, 메모리 누수가 발생할 수 있음
* 여러 번 구독하는 것을 방지
📑
참고 자료
Chat GPT
728x90
'C# > WPF' 카테고리의 다른 글
Grid와 StackPanel.. 그리고 ScrollViewer (0) | 2025.02.09 |
---|---|
[WPF] Dependency Property (0) | 2024.07.07 |
[WPF] ControlTemplate의 영향력 (0) | 2024.06.30 |
[WPF] 생성자 단위 초기화와 필드 단위 초기화 (0) | 2024.06.04 |
[WPF] MVVM 패턴에서의 전체 선택 (0) | 2024.05.19 |