인프런 커뮤니티 질문&답변

Ground2023님의 프로필 이미지
Ground2023

작성한 질문수

[C#/.NET 7.0]어서와, WPF는 처음이지?

선생님 안녕하세요

해결된 질문

작성

·

179

1

WPF 강좌를 듣다가 View에다가 포함시킬 예비 View를 만들어서 넣으려고 하고 잇습니다.

 

예를 들면 Popup_Window 라는 xaml.cs 가 있고

 

따로 OpenDoor.xaml, CloseDoor.xaml 이 있습니다

 

이 것들은 단지 코드 비하인드에는 아무것도 없고 디자인만 구현했습니다.

 

이것을 이제 Popup_Window에다가 넣으려고 하는데요

 

지금 Popup_Window에 잘 넣었고 원하는대로 실행이 되기는 합니다.

 

하지만

UserControl doorPage;

((ViewModel.DoorOpen)doorPage).DataContext = new Model.Doorpage_Model { StatusText = $"Door {i + 1} Open" };

((ViewModel.DoorOpen_Page_ViewModel)doorPage).Foreground = new SolidColorBrush(Colors.Red);

 

이런 방식으로 넣어서 이건 그냥 C# 을 쓴건지 WPF를 쓴건지 모를 정도로 코딩을 해버렸습니다.

 

Binding을 하여서 간결하게 UserControl을 넣고싶고 그런데 어떻게 고쳐야 하면 좋을지 알려주시면 정말 감사드리겠습니다.

 

답변 1

1

안녕하세요, 인프런 AI 인턴입니다.

WPF에서 UserControl을 View에 통합하고 데이터 바인딩을 사용하여 ViewModel과 연결하는 방법을 찾고 계신 것 같네요. WPF의 데이터 바인딩 기능을 활용하면 코드를 더 간결하고 관리하기 쉽게 만들 수 있습니다. UserControl의 DataContext를 ViewModel에 바인딩하고, XAML에서 Binding을 통해 필요한 속성을 연결하는 방식으로 구현할 수 있습니다.

예를 들어, Popup_Window 내에서 UserControl로 동적으로 View를 표시하고 싶을 때, UserControl의 DataContext를 해당 View의 ViewModel에 바인딩하여 명시적인 코드 대신 선언적 마크업을 사용할 수 있습니다.

XAML에서는 다음과 같이 UserControl의 DataContext를 바인딩할 ViewModel과 연결할 수 있습니다:

<UserControl x:Name="doorPage" DataContext="{Binding DoorPageViewModel}"/>

그리고 UserControl 내에서는 Binding을 이용해 ViewModel의 속성에 접근할 수 있습니다:

<TextBlock Text="{Binding StatusText}" Foreground="{Binding StatusColor}"/>

ViewModel에서는 StatusText와 StatusColor라는 속성을 정의하고 INotifyPropertyChanged 인터페이스를 구현하여 속성 변경 알림을 View에 전달하도록 합니다. 이렇게 하면 C# 코드에서 직접 UserControl의 속성을 설정하는 대신, 바인딩을 통해 ViewModel의 상태 변경이 View에 자동으로 반영되게 할 수 있습니다.

이와 같은 데이터 바인딩 접근 방식은 XAML과 C# 코드 사이의 결합도를 낮추고, 코드를 더 간결하게 유지하는데 도움을 줍니다. WPF에서 MVVM(Model-View-ViewModel) 패턴을 적극 활용하는 것이 좋습니다.

질문에 더 구체적인 코드 예시나 문제 상황이 있다면 추가적으로 알려주시면 좀 더 구체적인 도움을 드릴 수 있을 것 같습니다.

Ground2023님의 프로필 이미지
Ground2023

작성한 질문수

질문하기