WPF 사용자 정의 컨트롤 데이터에 접근하는 방법
😢상황
MainWindow.xaml.cs
에서 사용자 정의 컨트롤 내부의 데이터를 변경하거나 상태를 바꾸고 싶음- 예: 텍스트를 바꾸거나, 특정 표시 요소를 보이게/숨기고 싶음
- 그런데 사용자 컨트롤 내부의 요소들이
private
이라 접근이 불가능하고,
FindName()
이나public
필드로 열어두는 방식은 찝찝함
🛠️해결법
방법 1: 속성을 통해 접근 (Property)
// MyCustomControl.xaml.cs
public partial class MyCustomControl : UserControl
{
public string MyText
{
get => myTextBox.Text;
set => myTextBox.Text = value;
}
}
<!-- MainWindow.xaml -->
<local:MyCustomControl x:Name="MyControl" />
// MainWindow.xaml.cs
MyControl.MyText = "변경된 텍스트";
💡 가장 권장되는 방식. XAML 디자이너 호환, 캡슐화 유지, 재사용성 모두 만족
방법 2: 메서드를 통해 접근
// MyCustomControl.xaml.cs
public void SetWarningMode(bool isEnabled)
{
warningBorder.Visibility = isEnabled ? Visibility.Visible : Visibility.Collapsed;
}
// MainWindow.xaml.cs
MyControl.SetWarningMode(true);
💡 상태 변화, 조건 기반 UI 조작 등은 메서드가 더 명확할 수 있음
⚠️ 하지 말아야 할 방식
방식 | 이유 |
---|---|
내부 필드에 직접 접근 (public TextBox myTextBox ) |
캡슐화 위반, 유지보수 어려움 |
FindName("myTextBox") 호출 |
구조 변경 시 깨짐, 매우 취약 |
컨트롤을 FrameworkElement 로 캐스팅해서 조작 |
타입 안정성 없음, 런타임 오류 위험 |
✅정리: 왜 이게 효과 있었는가?
- WPF 사용자 정의 컨트롤은 UI 캡슐화가 중요한 구조
public
속성이나 메서드를 통해 외부 접근 지점을 의도적으로 설계해야 유지보수와 재사용에 유리- 정석적인 구조는 XAML 디자이너 호환성과 가독성까지 챙길 수 있음