WPF bind 문제

안녕하세요. WPF 구현 중 잘 안되는 부분이 있어 의견 여쭙고자 글을 올립니다.

다름이 아니라
Source의 구성은 다음과 같습니다.
MainModel ↔ MainViewModel ↔ MainWindow.xaml(VIEW)

MainWindow내에는 6개의 UserControl로 구성 되어있는 UserControl이 있고 그 구성은 다음과 같습니다.
MainWindow.xaml 내부 Grid필드에 UserControlA.xaml ( UserControlB.xaml 6개로 구성되어 있는 UserControl )

MainModel에서 Array형태의 Struct 변수를 MainWIndow내 UserControl 의 구성 요소에 각각 binding을 하고 싶은데, ( Struct의 경우 내부에 다수의 변수를 포함하고 있고 대표적으로 String Name 변수를 가지고 있습니다. )
예를 들어,
첫번째 UserControlB.xaml 의 TextBox에 MainModel Struct[0]의 Name을
두번째 UserControlB.xaml에는 TextBox에 MainModel Struct[1]의 Name을 …

  1. Window내부에 다양한 Page로 구성되어 있는 개체에 array형태로 데이터를 binding을 하고 싶은데 방법이 있을까요?

  2. WPF Binding의 경우 간단한 부분은 할 수 있겠는데 조금 더 고급이고 실무에서 사용하는 참고할 만한 예제나 opensource 알고 계시면 공유 해주시면 감사하겠습니다.

설명이 다소 난잡한데 답변 주시면 감사하겠습니다.

2개의 좋아요

기본적으로 직접 xaml에서 하드코딩으로 배열의 인덱스로 직접 접근해서 바인딩 처리 할 수 있습니다.

<TextBlock Text="{Binding XXX[0].Name}"/>
<TextBlock Text="{Binding XXX[1].Name}"/>

또는

<Grid DataContext="{Binding MainModel Struct[0]}">
    <TextBlock Text="{Binding Name}"/>
</Grid>

<Grid DataContext="{Binding MainModel Struct[1]}">
    <TextBlock Text="{Binding Name}"/>
</Grid>

추가로 현재 코드를 공유해 주시면 답변에 더 도움이 될듯 합니다.

4개의 좋아요

마이크로소프트의 문서만 보셔도 전반적인 이해를 하실 수 있습니다. 잘 설명되어 있습니다.

핵심은 DataContext인데 상위 컨트롤에만 (예를 들어 Window) 지정하면 그 하위 컨트롤에는 자동으로 동일한 DataContext가 적용됩니다.

| MainWindow.xaml

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataContext = new MainViewModel();
        }
    }

| MainWindow.xaml

...
    <Grid>
        <local:UserControlA />
    </Grid>
...

| UserControlA.xaml

...
    <StackPanel Orientation="Vertical">
        <local:UserControlB DataContext="{Binding Models[0]}" />
        <local:UserControlB DataContext="{Binding Models[1]}" />
        <local:UserControlB DataContext="{Binding Models[2]}" />
        <local:UserControlB DataContext="{Binding Models[3]}" />
        <local:UserControlB DataContext="{Binding Models[4]}" />
        <local:UserControlB DataContext="{Binding Models[5]}" />
    </StackPanel>
...

| UserControlB.xaml

...
<Label Content="{Binding Name}" />
...

이렇게 구성하고 MainViewModel을 다음처럼 만들었을 떄,

| MainViewModel.cs

    public class MainViewModel
    {
        public MainModel[] Models { get; } = new MainModel[]
        {
            new() { Name = "Model1" },
            new() { Name = "Model2" },
            new() { Name = "Model3" },
            new() { Name = "Model4" },
            new() { Name = "Model5" },
            new() { Name = "Model6" },
        };
    }

| MainModel.cs

    public class MainModel
    {
        public string Name { get; set; } = string.Empty;
    }

다음의 실행 결과를 확인할 수 있습니다.

image


2개의 좋아요

스택오버플로우에서도 바인딩 관련해서 다양한 방법들을 확인할 수 있습니다. :smile:

2개의 좋아요

친절한 답변 감사드립니다!

1개의 좋아요

항상 친절하고 세부적으로 답변해주셔서 감사합니다! 큰 도움이 됩니다!

1개의 좋아요

좋은 정보 공유 감사드립니다!!

1개의 좋아요