mvvm 학습 중에 DataContext를 찾을 수 없는 경고가 있어 질문 드립니다.

실행은 잘 되고 있지만 해당 페이지 데이터 바인딩 중 경고가 발생을 하였는데 어느 부분을 보면 될까요?.

비하인드 코드에 해당 모델을 DataContext에 할당 및 app.xaml에 뷰 모델 등록을 잘 해두었습니다.
해당 예제는 net5.0 기준으로 작성 되었고 저의 프로젝트는 net8.0 기준으로 설정 하여 작성하고 있습니다.
net 버전을 올리면서 필요한 네임스페이스가 빠졌을까요?

우선 상세 코드가 없어서 모르겠는데, wpf를 디버깅하는 도구중에 snoop이라는 도구가 있습니다.

wpf개발자는 몰라선 안되는 중요한 도구인데 그걸로 데이터컨텍스트에 어떤 객체가 바인딩 되어있는지 먼저 확인해보시면 경험에 도움이 되실듯 합니다.

3개의 좋아요

댓글 주셔서 감사합니다.
이 네임스페이스 두줄로 경고가 사라지는 것을 확인했습니다.
xmlns:viewmodels=“clr-namespace:Wpf_MvvmFramework.ViewModels”
d:DataContext=“{d:DesignInstance Type=viewmodels:MainViewModel}”

뷰모델 네임스페이스를 추가 해보니 제대로 바인딩 되는 것 같습니다.
알려주신 snoop 도구도 사용 해 보도록 하겠습니다.
감사합니다.

2개의 좋아요

일반적인 WPF 뷰(Page, Window, UserControl 클래스)는 ~~~~.xaml 파일과 ~~~~.xaml.cs 파일로 구성되어 있으며, 이 두 요소는 컴파일되어 실행되기 전인 디자인 타임(design-time)에는 서로 독립적인 요소입니다.

따라서 디자인 타임에는 XAML 편집기가 ~~~~.xaml 파일의 코드비하인드인 ~~~~.xaml.cs에서 설정한 DataContext 정보를 알 수 없습니다.

올려주신 내용을 보면 HomePage 뷰의 DataContextHomeViewModel 클래스일 것으로 예상되지만, XAML 편집기는 이를 인지하지 못하므로 (실제 실행 시 오류는 아니지만) DataContext에서 Title 속성을 찾을 수 없다는 디자인 타임 오류 메시지를 출력하게 됩니다. 또한, 바인딩 관련 자동완성 기능도 정상적으로 동작하지 않게 됩니다.

이 문제를 해결하려면 디자인 타임에 해당 뷰의 DataContext가 어떤 타입인지 XAML 편집기에 명시적으로 알려줘야 합니다.

예를 들어, HomeViewModel 클래스가 Wpf_MvvmFramework.ViewModels 네임스페이스에 정의되어 있다고 가정하면, 아래와 같이 XAML에 두 줄을 추가하면 됩니다.

<Page x:Class="Wpf_MvvmFramework.Views.HomePage"
      ...
      xmlns:vm="clr-namespace:Wpf_MvvmFramework.ViewModels"
      d:DataContext="{d:DesignInstance {x:Type vm:HomeViewModel}}">
    ...

(주의 할 점은 DataContext 속성이 아닌 앞에 d: 네임스페이스가 붙는 d:DataContext 속성이라는 것)

이처럼 최상위 요소 뿐만 아니라 XAML 편집기가 DataContext의 타입을 추정할 수 없는 구간에 d:DataContext 속성을 적절히 지정해 주시고, DataTemplate을 정의할 때도 DataType속성을 명시적으로 지정해주시면 불편한 오류메시지도 사라지고 디자인 타임에서도 바인딩 대상 속성을 인식할 수 있어 보다 편리하게 XAML 코드를 작성할 수 있습니다.

이상입니다.

5개의 좋아요

앗!! 감사합니다.
목 멕히던게 뻥 뚫리는 느낌입니다.
감사합니다

3개의 좋아요