EnityFramework 데이터 1위에서 모델 클래스를 INotifyPropertyChanged에 대응

중앙 공민관


EF 데이터 우선 최고예요. 대응INotifyPropertyChanged하면 더 멋있겠죠.
라고 적었다.

INotifyPropertyChanged를 설치하는 것은 매우 번거롭다

  • INotifyPropertyChanged의 -Qita 구현
  • 그래서 짱인 누겟의 프로퍼티체인지.Foody를 사용합니다.
    INotifyPropertyChanged를 자동으로 구현합니다.fody 완전 편해. - Azure 갑니다.
    위의 글은 PropertyChanged.Fody 상당히 오래된 버전이기 때문에 지금 이 버전으로 실시하면 そんな古い形式使ってんじゃねーよばーかばーか 오류가 발생할 수 있으니 주의하세요.

    NotifyPropertyChanged.Foody 설치 방법

    
    public class HogeModel{
        public string Name{get;set;}
        public int AnyNumber{get;set;}
    }
    
    이것 괜찮아요?
    using System.ComponentModel;
    
    public class HogeModel{
        public event PropertyChangedEventHandler PropertyChanged;
    
        public string Name{get;set;}
        public int AnyNumber{get;set;}
    }
    
    이렇게
    그런 다음 프로젝트에 FodyWeavers.xml라는 파일을 추가합니다.
    FodyWeavers.xml
    <?xml version="1.0" encoding="utf-8" ?>
    <Weavers>
      <PropertyChanged/>
    </Weavers>
    
    그냥 이렇게 하는 거야.매우 편리합니다.

    INotify Pro를 eDMx로 내보내는 클래스에 설치하는 방법


    eDMx를 구성하는 모델 출력용 T4 템플릿을 직접 편집하면 OK

    PropertyChanged.Foody에 추가된 기술은요.
  • using에 추가System.ComponentModel
  • class 정의에 추가INotifyPropertyChanged
  • 구성원에 추가PropertyChangedEventHandler
  • 그래서 각각 보충한다.

    1. using 시스템.ComponentModel 추가


    출력using은 codeStringGenerator.UsingDirectives()입니다. 거기에 추가합니다.
    public string UsingDirectives(bool inHeader, bool includeCollections = true)
    {
        return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion())
            ? string.Format(
                CultureInfo.InvariantCulture,
                "{0}using System;{1}" +
                "{2}",
                inHeader ? Environment.NewLine : "",
                (includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "")
                    +Environment.NewLine +"using System.ComponentModel;", //これ
                inHeader ? "" : Environment.NewLine)
            : "";
    }
    
    

    2. class 정의에 INotifyPropertyChanged 추가


    출력class가 정의한 것은 codeStringGenerator.EntityClassOpening()
    public string EntityClassOpening(EntityType entity)
    {
        return string.Format(
            CultureInfo.InvariantCulture,
            "{0} {1}partial class {2}{3}",
            Accessibility.ForType(entity),
            _code.SpaceAfter(_code.AbstractOption(entity)),
            _code.Escape(entity),
            ":INotifyPropertyChanged"); //これ
            //_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
    }
    
    (entity.BaseType은 사용하지 않기 때문에 가로로 되어 있습니다. 사용 시 적당히 수정하십시오.)

    3. 멤버에게 P opertyChangedEventeHandler 추가


    템플릿 시작 EntityClassOpening(entity) 이후 직접 설명
    <#=codeStringGenerator.UsingDirectives(inHeader: false)#>
    <#=codeStringGenerator.EntityClassOpening(entity)#>
    {
        #pragma warning disable 0067 
        public event PropertyChangedEventHandler PropertyChanged; //これ
        #pragma warning restore 0067 
    
    
    다만 추가PropertyChangedEventHandler하면 CS0067(미사용 멤버)가 나와 답답해 사용pragma warning disable - restore으로 경고 표시를 억제했다.
    [C#] 컴파일할 때 경고 억제 | anopara
    그리고 파일 컴파일을 저장하면 됩니다.
    이런 느낌으로 출력.
    //------------------------------------------------------------------------------
    // <auto-generated>
    //     このコードはテンプレートから生成されました。
    //
    //     このファイルを手動で変更すると、アプリケーションで予期しない動作が発生する可能性があります。
    //     このファイルに対する手動の変更は、コードが再生成されると上書きされます。
    // </auto-generated>
    //------------------------------------------------------------------------------
    
    namespace models
    {
        using System;
        using System.Collections.Generic;
        using System.ComponentModel;
    
        public partial class 銀行マスタ:INotifyPropertyChanged
        {
                public event PropertyChangedEventHandler PropertyChanged;
                [Key]
                public string 銀行コード { get; set; }
                public string 銀行名 { get; set; }
                public string 銀行カナ { get; set; }
        }
    }
    
    좋아!

    용도 따위의

    INotifyPropertyChanged 뱉으면 윈퍼스의 Data Binding과 WPF의 Binding이 자동으로 리셋되기 때문에 View 모델처럼 사용할 수도 있고 진짜라고 할 수도 있고 정말 최고예요.

    좋은 웹페이지 즐겨찾기