본문 바로가기

[C#] WPF MVVM 기초 #2 View와 ViewModel 연결하기 일반 변수를넘겨보자.

I'm 영서 2024. 1. 24.
반응형

자 지난번

CalendarViewModel이 ViewModelBase를 상속받는김에 ViewModelBase에 대해서 공부했다. 

이제 그 ViewModel을 Calender와 연결해보자.

 

구조

 

현재까지 대략적인 완성물

12월과 1월 달력

 

근무시간에 따라 색상을 주어야 하는데 계산이 조금 복잡하여 조금 걸린다.

아무튼. Holiday라는 테이블에 Holiday를 지정하고 분기에 따라 휴일 혹은 근무일을 그려주도록 하였다.

 

ViewModel

    public class CalendarViewModel : ViewModelBase

ViewModelBase를 상속받았다. 지난번 공부했다시피 GetProperty와 SetProperty를 구현하기 위한 추상클래스로

잘 써보자

 

일단 변수는 두개를 사용하였다.

        private int _month = DateTime.Now.Month;
        private int _year = DateTime.Now.Year;
        
        public int Month
        {
            get => _month;
            set =>  GetProperty(ref _month, value);
        }

        public int Year { 
            get => _year; 
            set => GetProperty(ref _year, value);
        }
        
        protected T GetProperty<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
        {
            if (!EqualityComparer<T>.Default.Equals(field, value))
            {
                field = value;
                RaisePropertyChanged(propertyName);
            }
            return field;
        }

선언과 동시에 초기화해주고 get을 통해 값을 가져온다.

왜 SetProperty를 사용하지 않았는가?

 

다른 부분에서 _month와 _year의 값을 초기화 해줄것이기 때문이다. 따라서 사용하기에 편리하게 GetProperty 매서드를 만들어 Notify하도록 하였다.

참고로 뒤에서 사용하지만 

        public List<UserControl> DayPickers { 
            get => _dayPickers;
            set => SetValue(ref _dayPickers, value);
        }

SetValue를 사용해도 된다.  😍

 

그리고 

Calendar.xaml에서 

DataContext와 Grid Definitions를 작성해준다.

 <UserControl.DataContext>
     <ViewModels:CalendarViewModel/>
 </UserControl.DataContext>
 <Grid Background="White" x:Name="calendarGrid" >
     <Grid.ColumnDefinitions>
         <ColumnDefinition></ColumnDefinition>
         <ColumnDefinition></ColumnDefinition>
         <ColumnDefinition></ColumnDefinition>
         <ColumnDefinition></ColumnDefinition>
         <ColumnDefinition></ColumnDefinition>
         <ColumnDefinition></ColumnDefinition>
         <ColumnDefinition></ColumnDefinition>
     </Grid.ColumnDefinitions>
     <Grid.RowDefinitions>
         <RowDefinition Height="30"></RowDefinition>
         <RowDefinition Height="25"></RowDefinition>
         <RowDefinition></RowDefinition>
         <RowDefinition></RowDefinition>
         <RowDefinition></RowDefinition>
         <RowDefinition></RowDefinition>
         <RowDefinition></RowDefinition>
         <RowDefinition></RowDefinition>
     </Grid.RowDefinitions>

 

이렇게만 UserControl.DataContext 태그로만 CalendarViewModel을 지정해주면 끝이다.

 

이제 {Binding}을 통해 Month와 Year 등 ViewModel에서 public으로 작성한 값에 접근할 수 있다!

반응형

댓글