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 |