데이터템플릿의 바인딩이 작동하지 않습니다

wpf를 배우면서 간단한 프로그램을 만들고 있는데요
리스트박스의 데이터 템플릿에 유저컨트롤을 쓰는데
바인딩이 적용이 안되는 것 같아서 해결 방법을 알고 싶어서 글 올립니다.

대충 이런 유저컨트롤이 있습니다.

 public partial class EditableLabel : UserControl
 {
     public static DependencyProperty OutTextProperty;

     public string OutText
     {
         get => (string)GetValue(OutTextProperty);
         set => SetValue(OutTextProperty, value);
     }

     static EditableLabel()
     {
         InitializeComponent();            
         var meta = new FrameworkPropertyMetadata();
         meta.AffectsRender = true;
         OutTextProperty = DependencyProperty.Register(nameof(OutText), typeof(string), typeof(EditableLabel), meta);
     }
}

바인딩을 시도하는 xaml 부분입니다.

                <ListBox ItemsSource="{Binding Characters}">
                    <ListBox.ItemTemplate>
                        <DataTemplate DataType="{x:Type model:Character}">
                            <!-- 문제되는 부분-->
                            <view:EditableLabel OutText="{Binding Name}"> 
                            <!-- -->
                           </view:EditableLabel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

여기서 Binding Name이 의도한 대로 작동을 안 합니다.
제가 의도한 것은 바인딩된 Character 객체의 Name이 OutText에 설정되어 리스트박스에 추가되는 것인데
아무런 동작을 안하는 것 같습니다.
디버그 찍어보니 OutText 프로퍼티가 전혀 안 불리더군요.
혹시 DataContext 문제인가 했는데 제대로 Character 객체가 들어가는 것을 확인했습니다.
그런데도 Character 객체의 Name이 OutText로 할당이 안됩니다.

어디가 잘못된 것인지를 잘 모르겠습니다.
바인딩 설정을 다르게 해야하는 것일까요?

1개의 좋아요

일단 Dependency Property가 Binding을 통해 값을 제공하거나 설정되는 경우에는 일반 프로퍼티 정의의 getset을 호출하는 대신에 정적 Dependency Property에 대해 GetValue()SetValue() 함수를 직접 호출하기 때문에 중단점이 적중되지 않는 것은 정상입니다.

OutText 속성이 해당 컨트롤에서 어떻게 사용되는지 코드의 나머지 부분이나 EditableLabel 클래스의 XAML 코드도 함께 올려주시면 좋을 것 같네요.

그리고 현재 이상한 점은
InitializeComponent() 함수가 static 생성자 안에서 호출되고 있습니다.
컨트롤의 인스턴스가 생성될 때 생성자에서 InitializeComponent() 함수가 호출되어야 XAML 코드를 바탕으로 컨트롤을 구성할 수 있습니다.

public EditableLabel()
{
    InitializeComponent();
}
     
static EditableLabel()
{
    var meta = new FrameworkPropertyMetadata();
    meta.AffectsRender = true;
    OutTextProperty = DependencyProperty.Register(nameof(OutText), typeof(string), typeof(EditableLabel), meta);
}
2개의 좋아요

@al6uiz 말씀처럼 InitializeComponent() 부분은 정적 생성자가 아닌 인스턴스 생성자로 이동해야 합니다.

좀더 자세하게 설명해주시면 좋을 것 같네요!!

1개의 좋아요

답글 감사합니다!
중단점이 안 먹히는게 정상이었군요.
아 이걸 몰라서 시간 낭비를 엄청 했었네요.

InitializeComponent는 적으신 대로입니다.
실제 코드는 저렇게 돼있는데 제가 글 올리면서 오히려 실수했습니다.

그런데 어쩌다보니까 문제가 해결돼버렸습니다.
솔루션 정리하고 다시 빌드하니까 또 잘 되더라구요…

2개의 좋아요

다음부터는 좀 더 자세하게 적어서 올리겠습니다.
답변 감사합니다!

1개의 좋아요