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개의 좋아요

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

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

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

1개의 좋아요

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

1개의 좋아요

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

1개의 좋아요

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

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

혼선 드려 죄송합니다.

1개의 좋아요

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

1개의 좋아요

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

2개의 좋아요

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

2개의 좋아요

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

1개의 좋아요

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

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

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

댓글 감사합니다.

1개의 좋아요

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

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

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

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

1개의 좋아요

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

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

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

1개의 좋아요

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

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

2개의 좋아요

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

지금처럼 샘플 만들어서

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

4개의 좋아요