Blog categories

Comments

[WPF] Model Binding을 위한 속성 변경 알림 구현

[WPF] Model Binding을 위한 속성 변경 알림 구현

모델(Model) 객체에 대해 OneWay 혹은 TwoWay 바인딩을 지원하기 위해서는 속성 변경 알림이 구현되어야 합니다.

using System.ComponentModel;
 
namespace SDKSample
{
  // This class implements INotifyPropertyChanged
  // to support one-way and two-way bindings
  // (such that the UI element updates when the source
  // has been changed dynamically)
  public class Person : INotifyPropertyChanged
  {
      private string name;
      // Declare the event
      public event PropertyChangedEventHandler PropertyChanged;
 
      public Person()
      {
      }
 
      public Person(string value)
      {
          this.name = value;
      }
 
      public string PersonName
      {
          get { return name; }
          set
          {
              name = value;
              // Call OnPropertyChanged whenever the property is updated
              OnPropertyChanged("PersonName");
          }
      }
 
      // Create the OnPropertyChanged method to raise the event
      protected void OnPropertyChanged(string name)
      {
          PropertyChangedEventHandler handler = PropertyChanged;
          if (handler != null)
          {
              handler(this, new PropertyChangedEventArgs(name));
          }
      }
  }
}

위 코드를 매번 구현하면 중복된 코드도 많아지고, 매우 귀찮습니다.
하여 ModelBase 클래스를 구현한 후 상속해 쓰도록 할 수 있습니다.
아래 코드는 GalaSoft.MvvmLight.ViewModelBase 코드를 참고하였습니다.

using System.Runtime.CompilerServices;
using System.ComponentModel;
 
    public class ModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
 
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if(handler == null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
 
        protected bool Set<T>(ref T field, T newValue = default(T), [CallerMemberName] string propertyName = null)
        {
            field = newValue;
 
            if(propertyName != null)
            {
                OnPropertyChanged(propertyName);
 
                return true;
            }
 
            return false;
        }
    }

이렇게 되면 코드는 아래와 같이 바뀝니다.

namespace SDKSample
{
  public class Person : ModelBase
  {
      private string name;
 
      public Person()
      {
      }
 
      public Person(string value)
      {
          this.name = value;
      }
 
      public string PersonName
      {
          get { return name; }
          set
          {
              Set(ref name, value);
          }
      }
  }
}

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

div#stuning-header .dfd-stuning-header-bg-container {background-color: #3f3f3f;background-size: cover;background-position: top center;background-attachment: initial;background-repeat: no-repeat;}#stuning-header div.page-title-inner {min-height: 350px;}