안녕하세요. 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을 …
-
Window내부에 다양한 Page로 구성되어 있는 개체에 array형태로 데이터를 binding을 하고 싶은데 방법이 있을까요?
-
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;
}
다음의 실행 결과를 확인할 수 있습니다.

2개의 좋아요
스택오버플로우에서도 바인딩 관련해서 다양한 방법들을 확인할 수 있습니다. 
2개의 좋아요
항상 친절하고 세부적으로 답변해주셔서 감사합니다! 큰 도움이 됩니다!
1개의 좋아요