최대 1 분 소요

😢상황

  • 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 디자이너 호환성과 가독성까지 챙길 수 있음