dependency property 의 getter setter

UserControl에 Dependecy Property를 이용해 객체를 생성했습니다.

public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
            nameof(logText), typeof(string), typeof(ConsoleControl), new PropertyMetadata(string.Empty));
        
        public string logText
        {
            get { return (string)GetValue(TextProperty); }
            set
            {
                var r = ProcessLogData(value);
               // SetValue(TextProperty,r); 
               SetValue(TextProperty,Value)
            }
        }

원래 저의 생각은 View에서 값을 해당 속성값으로 전달해주면 setter가 동작해야한다고 생각하는데, setter는 전혀 동작하지 않네요.
setter에서 데이터를 조작하고 그다음에 SetValue로 데이터를 넘겨준다고 생각했는데, 동작원리가 이해가 안갑니다.
해외 커뮤니티를 찾아봐도 dependency property는 SetValue 자체를 가져온다는 말밖에 없어서… 혼란이 오네요…

결론은 Main에서 속성값으로 넘겨준 데이터를 userControl 비하인드에서 가공하여 userControl의 TextBox에 보여주고 싶은데 방법이 없나요??

UserControl의 xaml에 바인딩까진 다 해놨습니다. 가공 없이 데이터 바인딩 되는것까진 확인이 되는데, 가공한다음 바인딩을 어떻게 해야할지 모르겠네요…

고수님들의 답변 기다리겠습니다. 감사합니다.

ps.Setter 안에 SetValue를 지워도 UI 에 데이터는 올라가네요… 신기…

2개의 좋아요

new PropertyMetadata(string.Empty)

여기에 callback 을 줄수 있습니다.

2개의 좋아요

답변 감사합니다.
콜백을 사용하면 접근해야할 변수나 함수들을 static으로 선언을 해줘야하는데,
무조건 그렇게 사용을 하는것이 관례인가요?

2개의 좋아요

콜백 메서드는 static이지만 DependencyObject를 받기 때문에 해당 객체의 인스턴스를 그대로 사용하실 수 있습니다.

ConsoleControl consoleControl = (ConsoleControl)d;

따라서 static 선언이 필요하지 않습니다.

1개의 좋아요

DependencyProperty 는 일반 Property와 전혀 다른 동작과 개념 입니다.

DP를 정의 할때 DependencyProperty.Register 를 통해
정의 하게 되는데 저기서 지정한 type이 Key가 되어 DP 이름과 타입의 해시코드 조합으로

PropertyFromName테이블 이란곳에 보관하고 관리 하게 됩니다.

이러한 행위는 공통으로 사용 되는 속성들은 한곳에서 관리하여 메모리를 절약 하기 위함으로 static으로 관리 되는 것 입니다.

따라서 DP의 속성 값 변화는 propertyChangedCallback에서 감지 할 수 있고,

propertyChangedCallback 메서드의 첫번째 파라메터 DependencyObject에서
직접 해당 객체에 캐스팅 해서 접근 할 수 있습니다.

4개의 좋아요