DataTemplate 사용 관련

우선 코드를 먼저 보여 드리면

// App.Resources.xaml
<DataTemplate DataType="{x:Type plotvm:PlottingViewModel}">
    <plotv:PlottingView />
</DataTemplate>

// PlottingViewModel.cs
public class PlottingViewModel : ReactiveObject, IContext
{
	// ...
}

// PlottingView.xaml
<UserControl
    x:Class="Uttu.Plotting.Views.PlottingView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vm="clr-namespace:Uttu.Plotting.ViewModels"
    d:DataContext="{d:DesignInstance vm:PlottingViewModel}"
    mc:Ignorable="d">
   // ....
</UserControl>

// DialogWindow.xaml
<Window
    x:Class="Uttu.CAD.UI.DialogWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    WindowStartupLocation="CenterOwner"
    mc:Ignorable="d">
</Window>

// DialogService.cs
public bool? ShowDialog(IContext content)
{
	var dialog = new DialogWindow();
	dialog.Content = content;
	// ...
	return dialoShowDialog();
}

이렇게 쓰고 있습니다.

화면에 정상적으로 나오긴 하는데
PlottingView가 두번 생성 됩니다.

그리고 같은 방식으로 다른 dialog 들도 쓰고 있는데
위 창만 이상하게 binding 된 값이 안들어 옵니다.

제가 뭔가 잘못 쓰고 있는 걸까요?

2 Likes

네 지금 코드에서는 두 번 생성되는 것이 맞습니다.

이 코드도 뷰모델을 로케이터처럼 가져와서 생성합니다.

지금 코드라면 굳이 IContext가 없고 Dialog의 Content에 아무것도 없어도 위 코드 때문에 View가 생길 것 같습니다.

1 Like

코드는 문제 없어 보입니다.
재현 되는 전체 프로젝트를 올려주실 수 있나요?

1 Like

이게… 사내 프로젝트라… 전체 공개는 어려습니다…

1 Like

아 d:DesigneInstance라는 걸 제가 몰랐네요.

찾아보니까 인스턴스가 할당되는 그런게 아닌가 보네요.

혼선 드려 죄송합니다.

1 Like

재현이 되는 최소한의 직접 구현하신 샘플 프로젝트라도…?

1 Like

아닙니다. 읽어 주셔서 감사합니다.

2 Likes

이게 덩치가 좀 있는 녀석이라… 바로는 안될듯 하네요.
일단 샘플 만들면서 찾아봐야 겠군요.
감사합니다.

2 Likes

PlottingView 생성자에 브레이크 포인터 찍어서 확인해보시죠. DataTemplate에서 만드는건 알겠는데 그외에 다른에서 DI하거나 할때 생성되는지도 확인해봐야할것 같아요.
IContent로 넘어오는 인자에는 ViewModel만 넘어오는건 맞죠?

1 Like

실제 소스에선 title, position, resize mode 등 정보값만 넘어 오고요

이걸 찍었을때 여기가 두번 탑니다.

아는분이
https://blog.naver.com/vactorman/221014167271
알려 주셔서 분석중입니다.

댓글 감사합니다.

1 Like

@Greg.Lee 님이 작성하신 포스트 내용은

Content 대상 ViewModel이 변경 될때 마다
View가 새롭게 만들어 져서 그에 캐시처리를 하는 방법에 대한 포스팅 인데

제가 이해한 질문자님의 현상은 dialog.Content = content; 시 View가 두번 연속 생성 되는 문제로 이해 했습니다.

ViewModel이 변경 될때 마다 View가 매번 생성되는 문제라면 지극히 당연한 정상적인 현상으로 캐시등으로 해결하시면 됩니다.

1 Like

네 위에 말씀 하신 내용이 맞습니다.
위에 말씀하신거에 ShowDialog 만 했는데 ShowDialog 내부에서 View를 두번 생성 하는 현상입니다.

위에 적은 블로그에서 뭔가 힌트가 있나 찾고 있었습니다.

(솔찍히… 보는데 몬말인지 잘 모르겠습니다… 어렵네요…ㅜ.ㅜ)

1 Like

하… 샘플 만들어서 해보니…
1번만 들어 오네요.

머가 문젠지 찾아 봐야 겠습니다.

2 Likes

이렇게 기존 코드에 문제가 있음이 증명 되었으니.,

지금처럼 샘플 만들어서

기존 코드도 샘플과 같이 하나 하나씩 걷어내면서 뭐가 문제인지 파악해 나가는 거죠 ! :smiley:

4 Likes