Vincent
7์ 22, 2022, 9:05์ค์
1
WPF ๋์ด ์งง์์ ์ด๋ฐ ๊ณ ๋ฏผ์ ์์ํ๋ ๋จ๊ณ์
๋๋ค.
WPF๋ View๋ฅผ ๊ตฌ์ฑํจ์ ์์ด UserControl์ด UserControl์ ์์์ผ๋ก ๋๊ณ , ๋ ๊ทธ UserControl์ด UserControl์ ์์์ผ๋ก ๋๋ฉด์ UserControl์๋ Layer๋ฅผ ๋๋ view๋ฅผ ์ต๋ํ ์ฌ์ฌ์ฉ๊ฐ๋ฅํ๋๋ก ๋ชจ๋ํํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ํ์ ์ผ๋ก ํ๋ฆฌ์ฆ์ด ๊ทธ๋ฐ ๊ฒ์ด์ฃ . (์์จ๋ดค์ง๋ง)
์ด ๋ UserControl์ ๋ง๋ค ๋๋ ์ฌ๋งํ๋ฉด ๋ถ๋ชจ-์์ ๊ฐ Binding ์ฒ๋ฆฌ๋ฅผ ์ํด์ ์์ ์
์ฅ์ด ๋๋ UserControl์์ DependencyProperty๋ฅผ ๋ง๋ค์ด์(์ ๊ณตํด์) ๋ถ๋ชจ์ปจํธ๋กค์์ ๋ถ๋ชจ์ปจํธ๋กค์ ViewModel์ด ๋ฐ์ธ๋ฉ ๋ ์ ์๋๋ก ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ ๊ฐ ์๊ฐํ์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๋ฐ์.
์ง๊ธ๋ถํฐ UserControl์ uc๋ผ๊ณ ํ๊ฒ ์ต๋๋ค.
A uc, B uc, C uc๊ฐ ์กด์ฌํฉ๋๋ค.
A๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ผ๋ก ์ฐ์ผ ์ฌ์ฌ์ฉ๋ฅ ์ด ๋๊ณ ๊ฐ์ฅ ๊ธฐ๋ณธ๋จ์์ uc์
๋๋ค. ๋ฐ๋ผ์ A๋ ๊ธฐ๋ณธ WPF ์ปจํธ๋กค๋ก๋ง ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. DP๋ฅผ 2๊ฐ ์ ์ํ์ต๋๋ค. ๋ํ ๋จ์ํ๊ฒ view์ ์ญํ ๋ง ํ๊ณ ์์ด, ViewModel(์ดํ vm)์ด ๋ฑํ ํ์์๊ธฐ ๋๋ฌธ์ DataContext = this; ๋ก ์ง์ ํ์ต๋๋ค.
B๋ A๋ฅผ ์์์ปจํธ๋กค์ผ๋ก ํฌํจํ๊ณ ์์ต๋๋ค. B๋ DP๊ฐ ํ์ํ์ฌ 2๊ฐ ์ ์ํ์ต๋๋ค. ์ญ์ A์ฒ๋ผ view์ ์ญํ ๋ง ํ๊ณ ์์ด์ DataContext = this; ๋ก ์ง์ ํ์ต๋๋ค.
C๋ B๋ฅผ ์์์ปจํธ๋กค์ผ๋ก ํฌํจํ๊ณ ์์ต๋๋ค. C์๋ vm์ด ์กด์ฌํฉ๋๋ค. ์ด C-vm์ ๋ฐ์ดํฐ๋ฅผ B์ Binding ํ๋ ค๋๋ฐ B์ A uc์ ๋ฐ์ธ๋ฉํ๊ณ ์ถ์ต๋๋ค. A๋ B๋ก ๊ฐ์ธ์ ธ ์์ผ๋ C๋ B ๋ฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ฐฉ๋ฒ์ B์ A์ ๋๊ฐ์ DP๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ B์์ ๋ง๋ DP๋ก C์์ ๋ฐ์ ๋ฐ์ดํฐ์ A์ ์ปจํธ๋กค์ ์๋ก ๋ฐ์ธ๋ฉ์ผ๋ก ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ์ธ๋ฐ์.
๊ทธ๋ผ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๊ฐ ๋ ๊ฒ์
๋๋ค.
A์ปจํธ๋กค
B์ปจํธ๋กค
C์ปจํธ๋กค
ํ์ฌ B์ A์ DP๋ฅผ ๋ง๋ค์ง ์์ ์ํ์
๋๋ค.
์ด๊ฑธ ๊ทธ๋ผ ๊ทธ๋ฅ ๋ง๋ค์ด์ C โ B โ A ๋ก ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋๋๋ก ํ๋ ค๋ค๊ฐ, ๋ง์ฝ์ ์ง๊ธ ์ด๊ฑฐ์ผ ๊ณ ์ 2์ธต๊ตฌ์กฐ์ง๋ง, ๋์ค์ 5์ธต, 10์ธต ๊ตฌ์กฐ์ uc๊ฐ ๋์จ๋ค๋ฉด ์ต์ข
uc๊น์ง ๊ฐ๋ฉด์ ์ฝ๊ฐ ๊ณ์ฐจ์์ด ์ ๊ฐ๋
๊ณผ ์ ์ฌํ๋งํผ dp๋ฅผ ๋ง๋ค๊ฒ ๋ ๊ฒ์
๋๋ค. (์ปจํธ๋กค๊ณผ ์ปจํธ๋กค ์ฌ์ด์ dp๋ฅผ ์ผ๋ง๋ ์์ฑํด์ฃผ๋๋์ ๋ฐ๋ผ ๊ทธ ๋ค์ ์ปจํธ๋กค์ dp๊ฐ ๋์ด๋จ.)
๊ทธ๋ผ ์ด ์์ ์์๋ B๋ A์ DP 2๊ฐ๋ฅผ ๋๊ฐ์ด ๋ง๋ค์ด์ ์ ๋ฌ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ ๊ฒ์
๋๋ค. ์ฌ์ค Command 2๊ฐ๋ฉด๋๋๋ฐ A ๋๋ฌธ์ DP๊ฐ ์ถ๊ฐ๋๋ ๊ฒ์ด์ฃ .
์ฌ์ค Template์ ์ด์ฉํ๋ฉด Control์ ๊ฒน๊ฒน์ด๋ก ์์ ๊ตฌ์กฐ๊ฐ ์๋๊ณ 1์ฐจ์์ ์ธ ๊ตฌ์กฐ๋ค๋ณด๋ Binding์ด ์ฝ์ต๋๋ค. ๊ทธ๋ผ ๋ชจ๋ view์ ๋ชจ๋ํ๋ฅผ template์ผ๋ก ํด์ผํ๋์งโฆ๋ง์ฝ template์ผ๋ก ํ๋ค๋ฉด dp๋ ์ด๋ค ์์ผ๋ก ์ฐํ์ํฌ์ง ๊ฐ์ด ์ ์์ต๋๋ค.
์ ๊ฐ ์๊ฐํ๋ ๋ฐฉ๋ฒ ์ธ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์๊น์?
2๊ฐ์ ์ข์์
nyjin
7์ 22, 2022, 9:20์ค์
2
๋์์ ๋๋ฆฌ๊ณ ์ถ์๋ฐ ์ ๋ฆฌ๋ฅผ ๋จผ์ ํด์ผ ํ ๊ฒ ๊ฐ์์์.
B๊ฐ A๋ฅผ ํ๊ณ ์๋ค.
C๊ฐ B๋ฅผ ํ๊ณ ์๋ค.
C๋ ViewModel์ด ์๋ค.
C์์ B๊ฐ ํ๊ณ ์๋ A์ ๋ฐ์ธ๋ฉ ํด์ผ ํ๋ค.
์ด๋ ๊ฒ ๋ง๋๊ฑธ๊น์?
3๊ฐ์ ์ข์์
Vincent
7์ 22, 2022, 9:21์ค์
3
์ ํํ์ญ๋๋ค. A๋ ์ฌ์ค Textbox๋ฅผ ํ๊ณ ์๋ uc์ผ ๋ฟ์ด๊ณ C์์ A์ Textbox์ ๋ฐ์ธ๋ฉํด์ผํ๋ ๊ฒ์
๋๋ค.
2๊ฐ์ ์ข์์
nyjin
7์ 22, 2022, 9:42์ค์
4
์ํ๋ก ์์ฑํ๊ฑฐ๋ผ ์ํด ๋ฐ๋๊ฒ์.
ํน์ ์ด๋ฐ ํํ๋ฅผ ๋ง์ํ์๋ ๊ฒ์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค์.
C ๋ MainWindow, MainViewModel๋ก ์ ์ํ์์ต๋๋ค.
MainViewModel์ B ์์ฑ์ผ๋ก BViewModel์ ํ์ต๋๋ค.
BViewModel์ A ์์ฑ์ผ๋ก AViewModel์ ํ์ต๋๋ค.
AViewModel์๋ ๋ฐ์ธ๋ฉ ๋์์ธ Text ์์ฑ์ด ์์ต๋๋ค.
ViewModels
public class MainViewModel : ObservableObject
{
private BViewModel _b;
public BViewModel B
{
get => _b;
set => SetProperty(ref _b, value);
}
}
public class BViewModel : ObservableObject
{
private AViewModel _a;
public AViewModel A
{
get => _a;
set => SetProperty(ref _a, value);
}
}
public class AViewModel : ObservableObject
{
private string _text;
public string Text
{
get => _text;
set => SetProperty(ref _text, value);
}
}
AView
<UserControl x:Class="WpfDemo.AView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfDemo"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<TextBlock Text="{Binding Text}" />
</Grid>
</UserControl>
BView
<UserControl x:Class="WpfDemo.BView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfDemo"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<StackPanel>
<local:AView DataContext="{Binding A}"></local:AView>
</StackPanel>
</UserControl>
MainWindow
ContentControl ๋์ BView๋ฅผ ์ง์ ์ ์ธํด๋ ๋ฉ๋๋ค๋ง, ContentControl์ ์ ์ธํ๊ณ Resource์ ViewModel๊ณผ View๋ฅผ ๋งคํํ์๋ฉด ๋ฐ์ธ๋ฉ๋ ViewModel ํ์
์ ๋ฐ๋ผ ๋์ ์ผ๋ก View๋ฅผ ๋ฌ๋ฆฌ ์ค์ ํ์ค ์ ์์ต๋๋ค.
<Window x:Class="WpfDemo.MainWindow"
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"
xmlns:local="clr-namespace:WpfDemo"
xmlns:viewModels="clr-namespace:WpfDemo.ViewModels"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<ContentControl Content="{Binding B}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type viewModels:BViewModel}">
<local:BView DataContext="{Binding}" />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</Grid>
</Window>
View์ ViewModel ์ฐ๊ฒฐ
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var viewModel = new MainViewModel
{
B = new BViewModel
{
A = new AViewModel
{
Text = "Hello world"
}
}
};
DataContext = viewModel;
}
MVVM ํ๋ ์์ํฌ๋ก Microsoft.Toolkit.Mvvm์ ์ฌ์ฉํ์ต๋๋ค~
4๊ฐ์ ์ข์์
Vincent
7์ 22, 2022, 10:06์ค์
5
ํํโฆ์ ๋ง View์ ๊ธฐ๋ฅ๋งํ๊ณ ์์ ์ปจํธ๋กค๋ก ๋ฐ์ธ๋ฉ ์ฑ๋๋ง ์ด์ด์ค์ฑ๋ก ๋ํ
์ผํ ๊ธฐ๋ฅ์ ๊ฐ์ฅ ์ต์์ ๋จ์์ ๋ฐ์ธ๋ฉ ์ฒ๋ฆฌํ ๊บผ๋ผ์โฆ ์ต์์ ๋จ์๋ง ViewModel์ด ์์ผ๋ฉด ๋ ๊ฑฐ๋ผ๋ ์๊ฐ์ด ๋
์ด ๋ ๊ฑฐ ๊ฐ๋ค์. (B, A ์ DataContext = this;)
DP๋ฅผ ๋ง๋ค ํ์ ์์ด ํ์ view๋จ์์ ๋ฐ์ธ๋ฉ์ด ๋ชจ๋ ๋์ด ์์ผ๋๊น ๊ฐ ViewModel ๋ผ๋ฆฌ ์์กดํด์ ๋ฐ์ดํฐ๋ง ๋๊ธฐ๋ฉด ์์์ ํํ์ด ๋๊ฒ ๊ตฐ์โฆ
์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ ๊ฐ ๋ง์๋๋ฆฐ ๊ฑด ViewModel์ ObservableProperty๊ฐ ์๋๋ผ uc์์ ์ฌ์ฉ๋๋ DependencyProperty ์์๋๋ฐ DP ๊ฑท์ด๋ด๋ ๋ ๊ฒ ๊ฐ๋ค์.
DP๋ก ํด์ View๋ผ๋ฆฌ ์๋ก ์์กดํ๋๋ก ํด์ ๋ง๋ค์ด๋ ๋ ๊ฒ ๊ฐ์ง๋ง์.
๋ง์ํ์ ๋ฐฉ์์ด ํจ์ฌ ํจ์จ ์ ์ผ ๊ฒ ๊ฐ์ต๋๋ค.
์ฝ๊ฒ ์ฝ๊ฒ ๊ฐ์ผ๋ฉด ๋์์ ํ
๋ฐ ๊ดํ ์ด๋ ต๊ฒ ํ๋ ค ํ๋๊ฑฐ๋ค์.
๊นจ๋ฌ์ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
2๊ฐ์ ์ข์์
Vincent
7์ 22, 2022, 10:09์ค์
7
๊ฐ์ฌํฉ๋๋ค ์ข์ ์ฃผ๋ง๋์๊ธธ ๋ฐ๋๋๋ค^^!
2๊ฐ์ ์ข์์