반응형
이번엔 컴포넌트가 아닌 UI단위의 기술을 이야기해보자.
WPF로 시작하면.... MainWindow가 기본으로 생긴다.
여기서 MainWindow내부에 UserControl을 만든다고 생각한다면
이런식으로.....
만약 이렇다면... MainWindow에서 UserControl로 변수를 넘기는 방법은 무엇이 있을까? 만약 반대의 경우라면? 또 각각의 경우에 따라 변수가 다같이 동기화가 되야 한다면??
복잡.. 그 자체....... 그냥 간단히 생각해보자
각각 MainWindow의 특정 변수가 있고... UserControl에도 특정 변수를 만들어서.. 2개를 항상 동일하게 변경해준다면... 이런 경우 문제가 발생될 일이 없을 것으로 생각된다.... 그러취?
이렇게 값이 변경될때 신경안쓰고 데이터가 동기화 하려면..??
바로 Binding!! 바인딩해버리면 양쪽 프로퍼티가 변경될때 PropertyChanged 함수에서 다 동기화도 알아서 해주니. 신경쓸게 뭐가 있겠는가!!
그리하여 생각한 방법은
이렇게 해주면 되지않을까??
그리하여 개발에 들어간다!!!
MainWindow
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<Window x:Class="TestProject.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:TestProject"
mc:Ignorable="d"
Title="MainWindow" Height="217.5" Width="332">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<TextBox Text="{Binding NAME, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
<Grid Grid.Row="1">
<local:UC_1/>
</Grid>
</Grid>
</Window>
|
cs |
MainWindow.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.Remoting.Contexts;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace TestProject
{
/// <summary>
/// MainWindow.xaml에 대한 상호 작용 논리
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void UC_1_NAME_INPUT(object sender, RoutedEventArgs e)
{
UC_1 UC_TEST = sender as UC_1;
}
}
}
|
cs |
UserControl.xaml
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<UserControl x:Class="TestProject.UC_1"
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:TestProject"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<TextBox Text="{Binding NAME, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Background="Beige"/>
</Grid>
</UserControl>
|
cs |
UserControl.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace TestProject
{
/// <summary>
/// UC_1.xaml에 대한 상호 작용 논리
/// </summary>
public partial class UC_1 : UserControl, INotifyPropertyChanged
{
public UC_1()
{
InitializeComponent();
}
private static DependencyProperty NAMEProperty =
DependencyProperty.Register("NAME", typeof(string), typeof(UC_1),
new FrameworkPropertyMetadata(string.Empty,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Inherits));
public string NAME
{
get { return (string)GetValue(NAMEProperty); }
set
{
SetValue(NAMEProperty, value);
}
}
private void OnPropertyChanged(string p)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(p));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
|
cs |
MainViewModel.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestProject
{
class MainViewModel : INotifyPropertyChanged
{
private string _name = string.Empty;
public string NAME
{
get
{
return _name;
}
set
{
_name = value;
OnPropertyChanged("NAME");
}
}
//PropertyChaneged 이벤트 선언 및 이벤트 핸들러
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
|
cs |
실행!
간단하다!!!!!
코드는 요기
반응형