none
데이타 바인딩 RRS feed

  • 질문

  • MVVM을 구현하려고 해요

    INotifyPropertyChanged 인터페이스를 구현했어요 .

    public class MyViewModel : INotifyPropertyChanged
    {
       public MyClass{get;set;}
      
    }

    MyClass는 아래와 같이 구현했어요

    public class MyClass
    {
         public MyClass()
         {
         }
         public string P1 { get; set; }
            
    }

    XAML에 DataContext에 MyViewModel 클래스 인스턴스를 설정하고


    XMAL에서 Text = "{Binding MyClass.P1}" 설정을 하고 실행을 하니 Text값이 안바끼네요.

    2011년 9월 20일 화요일 오후 4:11

답변

  • 위와 같은 경우에는 Text 속성에 바인딩된 프로퍼티가 P1 이기 때문에 MyClass 타입에 INotifyPropertyChanged 인터페이스를 구현해 주어야 합니다. 그러면 자연스럽게 "PropertyChanged" 라는 이벤트를 구현했을 텐데요. P1 { get; set; } 에서 set 접근자 내부의 코드에에서 해당 이벤트를 불러주는 코드를 넣어주면 정상적으로 작동할 것입니다.

    좀더 자세한 코드 예제는 다음의 문서를 참조하세요.

    INotifyPropertyChanged 인터페이스
    ; http://msdn.microsoft.com/ko-kr/library/system.componentmodel.inotifypropertychanged(v=vs.80).aspx

    • 답변으로 표시됨 rnflrnflqkd 2011년 9월 21일 수요일 오후 3:53
    2011년 9월 21일 수요일 오전 12:21
  • 안녕하십니까? rnflrnflqkd

    Microsoft MSDN Forum 사이트를 방문해 주셔서 감사합니다.

     

    문의 하신 “데이타 바인딩”에 대한 답변을 드리겠습니다.

     

    제 생각에는 두 가지 확인사항이 있습니다.

     

    1.     Binding 하는 Property Public입니다.

     

    2.     Binding 하는 Property에 속성 Set 메소드에 INotifyPropertyChanged이벤트 발생을 해야 합니다.

     

    MyClass.CS

     

    public class MyClass : INotifyPropertyChanged
    {
    #region Field
    private string _p1;
     
    public string P1
    {
        get { return _p1; }
        set
        {
            if (_p1 != value)
            {
                _p1 = value;
                //항상 정확한 속성 이름을 인자로 사용해야 합니다.
                RaisePropertyChanged("P1");
            }
        }
    }
    #endregion Field
     
     
    #region Constructor
    public MyClass()
    {
        P1 = "Test";
    }
    #endregion Constructor
     
    #region Event
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion Event
     
    #region EventHandler
    //이벤트 핸들러
    public void RaisePropertyChanged(string propname)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(thisnew PropertyChangedEventArgs(propname));
        }
    }
    #endregion EventHandler
     
    }

     

     

    참고 자료

     

    Binding.Path Property

    http://msdn.microsoft.com/en-us/library/system.windows.data.binding.path.aspx

     

    PropertyChanged 인터페이스

    http://msdn.microsoft.com/ko-kr/library/system.componentmodel.inotifypropertychanged(VS.80).aspx

     

    제가 문제에 대해 더 알아야 할 것이 있다면 응답 주시면 감사하겠습니다.

    제시해 드린 답변이 도움이 되었기를 바랍니다.

    2011년 9월 21일 수요일 오전 12:24
    중재자

모든 응답

  • 위와 같은 경우에는 Text 속성에 바인딩된 프로퍼티가 P1 이기 때문에 MyClass 타입에 INotifyPropertyChanged 인터페이스를 구현해 주어야 합니다. 그러면 자연스럽게 "PropertyChanged" 라는 이벤트를 구현했을 텐데요. P1 { get; set; } 에서 set 접근자 내부의 코드에에서 해당 이벤트를 불러주는 코드를 넣어주면 정상적으로 작동할 것입니다.

    좀더 자세한 코드 예제는 다음의 문서를 참조하세요.

    INotifyPropertyChanged 인터페이스
    ; http://msdn.microsoft.com/ko-kr/library/system.componentmodel.inotifypropertychanged(v=vs.80).aspx

    • 답변으로 표시됨 rnflrnflqkd 2011년 9월 21일 수요일 오후 3:53
    2011년 9월 21일 수요일 오전 12:21
  • 안녕하십니까? rnflrnflqkd

    Microsoft MSDN Forum 사이트를 방문해 주셔서 감사합니다.

     

    문의 하신 “데이타 바인딩”에 대한 답변을 드리겠습니다.

     

    제 생각에는 두 가지 확인사항이 있습니다.

     

    1.     Binding 하는 Property Public입니다.

     

    2.     Binding 하는 Property에 속성 Set 메소드에 INotifyPropertyChanged이벤트 발생을 해야 합니다.

     

    MyClass.CS

     

    public class MyClass : INotifyPropertyChanged
    {
    #region Field
    private string _p1;
     
    public string P1
    {
        get { return _p1; }
        set
        {
            if (_p1 != value)
            {
                _p1 = value;
                //항상 정확한 속성 이름을 인자로 사용해야 합니다.
                RaisePropertyChanged("P1");
            }
        }
    }
    #endregion Field
     
     
    #region Constructor
    public MyClass()
    {
        P1 = "Test";
    }
    #endregion Constructor
     
    #region Event
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion Event
     
    #region EventHandler
    //이벤트 핸들러
    public void RaisePropertyChanged(string propname)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(thisnew PropertyChangedEventArgs(propname));
        }
    }
    #endregion EventHandler
     
    }

     

     

    참고 자료

     

    Binding.Path Property

    http://msdn.microsoft.com/en-us/library/system.windows.data.binding.path.aspx

     

    PropertyChanged 인터페이스

    http://msdn.microsoft.com/ko-kr/library/system.componentmodel.inotifypropertychanged(VS.80).aspx

     

    제가 문제에 대해 더 알아야 할 것이 있다면 응답 주시면 감사하겠습니다.

    제시해 드린 답변이 도움이 되었기를 바랍니다.

    2011년 9월 21일 수요일 오전 12:24
    중재자