기은P
시간이 멈추는 장소
기은P
  • Programming (272)
    • 개발노트 (1)
    • FrontEnd (56)
      • ES&JS 문법 (14)
      • HTML&CSS (4)
      • React 기본 (18)
      • React 심화 (12)
      • React 이슈 (2)
      • Project 연습 (1)
      • Next.js (5)
    • Backend&Devops (33)
      • AWS (2)
      • Docker (9)
      • Jenkins (6)
      • Nginx (6)
      • Node.js (1)
      • ElasticSearch (5)
      • 프레임워크&아키텍처 (2)
      • 암호화 (0)
      • 기타 (2)
    • 알고리즘 (3)
    • C# (8)
      • WPF (8)
    • Java (51)
      • 순수 Java (18)
      • RDF&Jena (12)
      • RCP&GEF (9)
      • JMX (5)
      • JMapper (3)
      • 오류해결 (4)
    • Database (21)
      • RDBMS (9)
      • NoSQL (2)
      • TSDB (1)
      • GraphQL (1)
      • Hibernate (3)
      • 데이터베이스 이론 (4)
      • Redis (1)
    • 프로토콜 (11)
      • Netty (4)
      • gRPC (5)
      • 프로토콜 개념 (2)
    • Server (4)
      • Linux (4)
    • 2020 정보처리기사 필기 (43)
      • 목차 (1)
      • 기출문제 (1)
      • 1과목 - 소프트웨어 설계 (6)
      • 2과목 - 소프트웨어 개발 (7)
      • 3과목 - 데이터베이스 구축 (8)
      • 4과목 - 프로그래밍 언어 활용 (7)
      • 5과목 - 정보시스템 구축 관리 (10)
    • 2020 정보처리기사 실기 (31)
      • 목차 (4)
      • 기출예상문제 (19)
      • 실기요약 (8)
    • 빅데이터분석기사 필기 (4)
      • 목차 (0)
      • 필기 요약 (3)
    • 전기 공학 (1)
      • CIM (1)
    • 산업자동화시스템 (3)
      • SCADA (1)
      • OPC UA (2)
    • 디자인패턴 (1)
    • 휴지통 (0)

공지사항

  • 공지사항/포스팅 예정 항목

최근 댓글

최근 글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
기은P

시간이 멈추는 장소

WPF Fody 사용 방법
C#/WPF

WPF Fody 사용 방법

2020. 9. 16. 14:45
반응형

WPF Fody

 

1. 개요

WPF의 MVVM 패턴으로 코드를 작성하면서 변수 마다 get, set메서드를 작성하고 PropertyChange 이벤트 알림을 호출하는 방법이 상당히 비효율적이라고 느껴졌습니다.

 

이러한 변수들이 한 두개가 아니고 수십개, 수백개로 늘어나게 되면…

 

코드의 구조가 바뀌게 되면 이러한 모델 데이터도 바꾸어야 하기 때문에 코드 수정량이 많아집니다.

 

최근 Java의 Lombok이라는 다이어트 코드 라이브러리를 사용하면서 WPF에서도 위와 같은 코드 다이어트가 가능하지 않을까라는 생각에 조금 찾아보았는데 Fody라는 라이브러리를 발견했습니다.

 

처음에는 DevExpress의 Poco 라이브러리가 있어서 Telerik환경에서 poco를 사용할 수 있지 않을까 생각해보았지만 Fody라는 좋은 무료 라이브러리가 있더군요.

 

        private int thread_value1;
        public int Thread_value1
        {
            get { return thread_value1; }
            set
            {
                thread_value1 = value;
                RaisePropertyChanged("Thread_value1");
            }
        }

 

 

위와 같이 MVVM 패턴을 작성하다보면 겨우 한 개의 변수를 바인딩하는데 9~10줄의 코드가 소요가 됩니다. 굉장히 비효율적이죠.

 

이것도 BaseViewModel을 상속받아서 코드가 짧아진 편이고, 실제로는 INotifyPropertyChange 인터페이스를 상속해서 어쩌구 어쩌구…

 

Fody를 사용하게 되면 이런 코드가 1줄 짜리로 변하게 됩니다!

 

 

 

 

2. Nuget 설치

 

사용할 프로젝트에 Nuget 패키지 관리자를 통해서 PropertyChanged.Fody를 설치해줍니다.

 

그러면 자동적으로 FodyWeavers.xml라는 파일이 생성됩니다.

 

만약 생성이 안되어 있으면 FodyWeavers.xml라는 파일을 생성하고 내용을 채워줍니다.

 

<Weavers>
  <PropertyChanged/>
</Weavers>

 

패키지를 설치해도 FodyWeavers.xml 파일이 안보일 경우여서 파일을 새로 생성하면 파일이 이미 있다고 나올텐데, 이 경우에는 굳이 파일을 생성하지 않아도 됩니다.

 

 

 

솔루션 탐색기를 확인해서 위의 파일이 있다면 정상적으로 프로젝트에 Fody가 설치가 된 것입니다.

 

 

 

3. 사용방법

 

using System.ComponentModel;

    public class MainWindowViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public string Name { get; set; }

        public MainWindowViewModel()
        {
            Name = "Test Text";
        }
    }

 

ViewModel 클래스를 생성하고 INotifyPropertyChanged를 상속해줍니다.

 

그 후 public event PropertyChangedEventHandler PropertyChanged; 변수를 생성해주면 끝입니다.

 

TextBlock과 바인딩 하기 위해 Name이라는 변수를 생성했는데, public 타입의 앞글자는 대문자 컨벤션을 사용해서 get/set을 작성해주면 끝입니다.

 

<Window x:Class="FodyTest.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:vm="clr-namespace:FodyTest" 
        xmlns:local="clr-namespace:FodyTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"

    DataContext="{DynamicResource MainWindowViewModel}">

    <Window.Resources>
        <vm:MainWindowViewModel x:Key="MainWindowViewModel"/>
    </Window.Resources>
    <Grid>
        <TextBlock Text="{Binding Name}" FontSize="50"/>
    </Grid>
</Window>

 

Xaml에서 TextBlock의 Text값을 ViewModel의 Name과 Binding시켜줍니다.

 

 

 

4. 실행결과

바인딩이 잘 됩니다.

 

기본적인 사용방법은 위와 같고, 만약 해당 ViewModel 클래스에 Binding 시키고 싶지 않은 변수가 있다면 [DoNotNotify]를 변수 위에 선언해주면 됩니다.

 

 

public class Person : INotifyPropertyChanged
{
    public string GivenName { get; set; }
    [DoNotNotify]
    public string FamilyName { get; set; }
    public event PropertyChangedEventHandler PropertyChanged;
}

 

추가적인 사용방법과 Fody에 대해 더 알고 싶으시면 아래 링크를 참고해주시면 됩니다.

 

Fody주소 : https://github.com/Fody/PropertyChanged

Fody속성 : https://github.com/Fody/PropertyChanged/wiki/Attributes

 

 

 

반응형
저작자표시 변경금지

'C# > WPF' 카테고리의 다른 글

[C#] ERROR CS8107: '기본 리터럴'기능은 C# 7.0에서 사용할 수 없습니다.  (0) 2021.11.15
소스 코드 분석을 위한 소나 큐브(Sonar Qube) 사용법  (1) 2021.11.05
[C#] nuget package manager console 사용 방법  (0) 2020.09.03
[C#] Lazy Initialization(지연 초기화)란?  (0) 2020.09.01
[WPF] Text String Format Binding 사용 방법  (0) 2020.08.31
    'C#/WPF' 카테고리의 다른 글
    • [C#] ERROR CS8107: '기본 리터럴'기능은 C# 7.0에서 사용할 수 없습니다.
    • 소스 코드 분석을 위한 소나 큐브(Sonar Qube) 사용법
    • [C#] nuget package manager console 사용 방법
    • [C#] Lazy Initialization(지연 초기화)란?
    기은P
    기은P
    기은P의 블로그 일상과 개발 관련 포스팅 #React #Typescript #Next #Nest https://github.com/kimdongjang

    티스토리툴바