C# - 기타 개인기록 노트

업데이트:

소스코드 분석 노트

Option Attribute

커맨드 라인 파서 라이브러리

Command Line Parser Library는 CLR 응용 프로그램에 명령 줄 인수 및 관련 작업을 조작하기위한 깨끗하고 간결한 API를 제공합니다. 사용자 정의 수준이 높고 구문 오류를 사용자에게보고하는 간단한 방법으로 도움말 화면을 표시 할 수 있습니다. 지루하고 반복적으로 프로그래밍 할 수있는 모든 것이 라이브러리 숄더에 나타나 코어 로직에 집중할 수 있습니다. 이 라이브러리는 2005 년 이후 지속적으로 업데이트되는 API로 번거롭지 않은 명령 줄 구문 분석을 제공합니다 .

[Option("h", "help", HelpText = "Shows this help message")]
public bool Help { get; set; }


NamedPipeClientStream

상속구조

Object - MarshalByRefObject - Stream - PipeStream - NamedPipeClientStream

자식 프로세스와 부모 프로세스 개체 연결

https://docs.microsoft.com/ko-kr/dotnet/api/system.io.pipes.namedpipeclientstream?view=netcore-3.1

*** 기존 코드 해석: 프로그램이 실행중이면 프로그램으로 메시지 전송


if (ViewModelBase.IsInDesignModeStatic) return;

데이터 바인딩을 하겠다.

VS / Blend Designer 를 통해 실행될 때 true를 반환


뷰모델 초기화

ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

SimpleIoc.Default.Register<뷰모델>();


class MainWindow

인자로 path, key, embedded를 넣고 폼 초기화 및 뷰모델 초기화


RelayCommand

ICommand를 구현한 클래스.

버튼을 바인딩하고 이에 대한 인스턴스를 RelayCommand로 만들고 호출하는식으로 바인딩 구현.

RelayCommand OkCommand


ServiceLocator.Current.GetInstance<서비스 or="" 뷰모델="">();

해당 서비스, 뷰모델을 찾아서 값을 넣어준다.


ShowActivated

활성화 하지않고 윈도우 오픈

AWindow window = new Window();
window.ShowActivated = false;
window.Show();


CheckBeginInvokeOnUI()

MVVM에서 UI 쓰레드 호출 및 작업

 DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
}


코드 비하인트

xaml 아래에 위치하는 cs코드


.NET의 MVVM 패턴

MVVM

image

MVVM에서 가장 중요한 역활을 하는 것은 ViewModel입니다. ViewModel에서 얼마나 제공하느냐에 따라 View와 Model이 영향을 받기 때문입니다.

뷰모델은 4가지 주요한 요구 조건이 있습니다.

  1. 데이터는 뷰에서 노출되어야 한다.

  2. 뷰에서 사용 가능한 커맨드들을 제공한다. 이 커맨드는 ICommand를 통해 만든다.

  3. INotifyPropertyChanged 인터페이스를 구현한다.

  4. IDataErrorInfo 인터페이스를 구현한다.


INotifyPropertyChanged 인터페이스는 Observable 객체로 인터페이스를 상속하여 사용하는 것이 좋습니다.

그리고 호출을 통해 UI 변경을 알림으로써 동적으로 UI를 변경 할 수 있도록 기능을 제공합니다.

public class Demo : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public string PhoneNumber
    {
        get
        {
            return this.phoneNumberValue;
        }
        set
        {
            if (value != this.phoneNumberValue)
            {
                this.phoneNumberValue = value;
                NotifyPropertyChanged();
            }
        }
    }


위 이미지를 보시면 일단 프로젝트를 기능별로 나누고 작업하였습니다. Model에서는 해당 프로젝트에 필요한 비지니스로직들을 만들었으며, ViewModel에서는 그러한 비즈니스로직을 가져와서 INotifyPropertyChanged 인터페이스를 연결하였습니다.

또한, 파란색 으로 체크한 곳에서 데이터 콘텍스트를 해서 값을 받아올 수 있는데 이 방법 외에 다른 방법으로도 호출이 가능합니다. 일반적으로 INotifyPropertyChanged는 단일 데이터의 변경을 감지하는 것이고 만약에 리스트처럼 다수의 데이터를 조작하고 싶으면, INotifyCollectionChanged 인터페이스를 적용하고 ObservableCollection라는 클래스를 이용해서 데이터를 삽입해야 합니다.


데이터 바인딩의 요소로는 OneWay방식, OneWayToSource방식, TwoWay방식이 있습니다. OneWay방식은 한쪽에서 그냥 데이터의 변경을 감지하고 사용자에게 그 상황을 알려주는 것이라면, TwoWay방식은 사용자가 입력한 결과가 즉각적으로 화면에서 변경되는 방식입니다.


두번째로 자주 쓰이는 것 중 하나는 Command입니다. 이것은 Button, MenuItem, ToolbarItem, ImageCell, ListView등의 Class를 제어하기 위해 만들어졌습니다. Command는 DataBinding이 ViewModel의 메서드를 호출할 수 있도록 도와주는 역할로 MVVM패턴 개발에서 조금 더 단순하게 만들어 줄 수 있습니다.


MVVM 폴더 관리

  1. Views 폴더

Views 폴더는 말그대로 사용자가 처음 접하는 화면입니다. 여기서 그리드 레이아웃을 이용해서 디자인을 하고 데이터바인딩을 통해 ViewModel과 연결하는 코드들이 작성되는 곳입니다.

  1. Models 폴더

Models 폴더에서는 해당 프로젝트의 비즈니스로직이 작성되는 곳입니다. 예를 들어 주소록이라면 이름, 나이, 이메일 등의 가장 기본적인 변수들을 생성하는 곳이라고 보시면 됩니다.

  1. ViewModels 폴더

ViewModels 폴더에서는 Model의 비즈니스 로직과 Command 폴더의 ICommand 인터페이스를 받아와서 처리하는 곳입니다. 여기서 작성된 코드가 View와 데이터 바인딩이 되신다고 보면 될 것 같습니다.

  1. Command 폴더

Command 폴더에서는 버튼, 메뉴아이템, 리스트 뷰등의 상황에 맞게 데이터바인딩과의 관계를 정의해주는 공간입니다.

  1. Resources 폴더

Resources 폴더는 View에서 보여지는 Style을 정의하는 곳입니다. 해당 프로젝트의 App.xaml이 가장 먼저 실행되면서 MainWindow를 호출하고, 다양한 스타일 리소스들을 연결하는 것입니다.


IoC(Inversion of control)

제어역행이란 뜻으로 어플리케이션 제어를 역전시키는 프로그래밍 기술입니다. 즉, 호출자는 응답만 하면되며, 객체를 사용하는 것에 대한 결정을 할 필요가 없다. 이렇게 하면 호출자는 어플리케이션 흐름의 제어에 대한 권한을 가지지 않게 됩니다.

이러한 IoC를 통해 MVVM에서 뷰와 뷰모델이 서로 의존성을 가지게 하는 것을 방지할 수 있습니다.

  1. IoC 컨테이너를 활성화

  2. 라이프 사이클을 정의하는 정책을 사용 후 공통 서비스와 유틸리티를 등록한다.

  3. 내비게이션 서비스와 유틸리티에 대한 상대 의존관계와 뷰모델을 등록한다.

  4. 해당하는 뷰모델의 최종 인젝션과 뷰를 등록한다.

// 뷰 모델 등록
var vm = iocContainer.Resolve();
vm.InitializeData();

// 뷰 등록
var view = iocContainer.Resolve();

// 데이터 바인딩
view.DataContext = vm;

// INavigator 서비스를 통해 뷰 오픈
var service = iocContainer.Resolve();
service.ShowView(view);

태그: ,

카테고리:

업데이트:

댓글남기기