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๊ฐœ์˜ ์ข‹์•„์š”