Microsoft-ui-xaml: ํ† ๋ก : ์ตœ์‹  WinUI DataGrid - ํ•„์š”ํ•œ ์ž…๋ ฅ

์— ๋งŒ๋“  2019๋…„ 10์›” 28์ผ  ยท  81์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/microsoft-ui-xaml

ํ† ๋ก : ์ตœ์‹  WinUI DataGrid

์•ˆ๋…•ํ•˜์„ธ์š” ์ปค๋ฎค๋‹ˆํ‹ฐ ํšŒ์›๋‹˜๋“ค! DataGrid๋Š” ๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ Windows ์ปค๋ฎค๋‹ˆํ‹ฐ ๋„๊ตฌ ํ‚คํŠธ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋ฉฐ ๊ธฐ๋ณธ WinUI ์ปจํŠธ๋กค(!!)๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๊ทœ๋ชจ์˜ DataGrid๋ฅผ ์ตœ๊ณ ๋กœ ๋งŒ๋“œ๋Š” ๋ฐ ๋ฌด์—‡์ด ํ•„์š”ํ•œ์ง€ ํŒŒ์•…ํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ๋ถ„์˜ ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

DataGrid์˜ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์งˆ๋ฌธ์— ์‹œ๊ฐ„์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  1. DataGrid์— ์›ํ•˜๋Š” ์œ„์‹œ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  2. UI, UX ๋ฐ ์ „๋ฐ˜์ ์ธ ๋””์ž์ธ ์ธก๋ฉด์—์„œ DataGrid๋Š” ์–ด๋””์—์„œ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  3. DataGrid์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ์ข‹์•„ํ•˜๊ฑฐ๋‚˜ ์‹ซ์–ดํ•ฉ๋‹ˆ๊นŒ?
  4. DataGrid๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  5. ๋” ์ ํ•ฉํ–ˆ์œผ๋ฉด ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ผ๋ถ€ ๋ณต์Šต ๋ฐ ์ปจํ…์ŠคํŠธ๋Š” ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ด€๋ จ๋œ ๋งํฌ๋“ค


DataGrid ๋ฌธ์„œ ์ฝ๊ธฐ
DataGrid Nuget ํŒจํ‚ค์ง€ ๋‹ค์šด๋กœ๋“œ ๋ฅผ ํ†ตํ•ด DataGrid ๋‹ค์šด๋กœ๋“œ ๋ฐ ์ƒํ˜ธ ์ž‘์šฉ
WCT์—์„œ ๊ธฐ์กด .

discussion

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚ด ์œ„์‹œ๋ฆฌ์ŠคํŠธ : ๋‚˜์—๊ฒŒ ์ข‹์€ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ ๊ธฐ๋Šฅ์ด ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. html ์„ธ๊ณ„์—์„œ ์ผ๋ถ€ ์Šคํฌ๋ฆฐ์ƒท์„ ๋นŒ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์„ ํ˜ธํ•˜๋Š” ํ–‰ ์ˆ˜๋กœ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ์‰ฝ๊ฒŒ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

1

๋ณด์ด๋Š” ์—ด ์„ ํƒ/์„ ํƒ ํ•ด์ œ , ์—ด ์ •๋ ฌ , ๋ณต์‚ฌ , ์ธ์‡„

2

๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ํ˜•์‹์œผ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

3

์—ด์„ ๋“œ๋ž˜๊ทธํ•˜์—ฌ ์—ด ์žฌ์ •๋ ฌ.

4

์—ด ํ•„ํ„ฐ๋ง

5

๊ณ ์ • ํ—ค๋” - ์Šคํฌ๋กคํ•  ๋•Œ๋„ ํ—ค๋”๊ฐ€ ๋งจ ์œ„์— ์œ ์ง€๋จ

์ž์„ธํ•œ ๋‚ด์šฉ์€ XAML ํ…œํ”Œ๋ฆฟ์ด ์žˆ๋Š” ํ–‰ ์„ธ๋ถ€์ •๋ณด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

6

ํ–‰ ๊ทธ๋ฃนํ™”

7

๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ํ–‰ ์ˆœ์„œ

8

๋‚ด ์ƒ๊ฐ์— ์œ„์˜ ๊ธฐ๋Šฅ์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ์—์„œ ํ‘œ์ค€์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

DataGrid๋ฅผ html ์„ธ๊ณ„์—์„œ ๋‹๋ณด์ด๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๋„ ํฌํ•จํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ๋ฅผ ๋ณด๊ณ  ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ์— ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชฉ๋ก ๋ณด๊ธฐ์— ์ •์ฐฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ–‰์„ ์˜†์œผ๋กœ ์Šค์™€์ดํ”„ํ•˜์—ฌ ํŽธ์ง‘ , ์‚ญ์ œ , ํ”Œ๋ž˜๊ทธ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

sideswipe

์œ„์˜ ๊ธฐ๋Šฅ์€ ์ฃผ๋กœ "๋ฐ์ดํ„ฐ ํ‘œ์‹œ"๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ WinUI์—์„œ ์—ฌ์ „ํžˆ ๋ถ€์กฑํ•œ ๊ฒƒ์€ Microsoft Pivot Control ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ WinUI ๊ธฐ๋Šฅ(control)์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

MS๋Š” ์ด๋ฏธ ์ด์— ๋Œ€ํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋‹น์‹œ์—๋Š” ์ ˆ๋Œ€์ ์œผ๋กœ ๋ฉ‹์ง„ ์ปจํŠธ๋กค์ด์—ˆ์Šต๋‹ˆ๋‹ค.

pivot1

https://www.youtube.com/watch?v=ZJIkQ9nebKY

์ด์ œ WinUI๋ฅผ ๋ชจ๋“  ๊ธฐ๋ณธ ๊ธฐ๋Šฅ๊ณผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ์œผ๋กœ ํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํ‘œ์‹œ ๋ฐ ์‹œ๊ฐํ™” ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ฉ‹์ง„ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๊ฐ•๋ ฅํ•˜๊ณ  ๋ฉ‹์ง€๊ฒŒ ๋ณด์ด๋Š” ์‹œ๊ฐ์ ์œผ๋กœ ๋งค๋ ฅ์ ์ธ ์ปจํŠธ๋กค์„ ํฌํ•จํ•ด์•ผ ํ•˜๋Š” "๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ"์˜ ํž˜์„ ์‹ค์ œ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ€ ์œ„์˜ ๊ธฐ๋Šฅ(์‹œ๊ฐํ™”) ํ›„์— ๋ฐ์ดํ„ฐ์— ๊นŠ์ด ๊ฐœ๋…์„ ์ƒ์„ฑํ•˜๊ณ  ์šฐ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ์„ฑ์ธต๊ถŒ์œผ๋กœ ์•ˆ๋‚ดํ•˜๋Š” 2D/3D ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฑด ๋‹ค๋ฅธ ๋‚ ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ))

uwp2

๋ชจ๋“  81 ๋Œ“๊ธ€

๋” ๋งŽ์€ ๋ณด๊ธฐ ๋ชจ๋“œ. ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ์™€ ์•„์ด์ฝ˜ ๋ณด๊ธฐ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. DataGrid๋Š” ํ‘œ์ œ ํ–‰๊ณผ ์—ด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ๋ฃนํ™”๋กœ ๊ทธ๋ฆฌ๋“œ์— ์•„์ด์ฝ˜/ํ•ญ๋ชฉ์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ WinUI ๋Œ€ Win32์˜ ์ธก๋ฉด์€ 1:1๋งŒํผ ์‰ฝ์ง€ ์•Š์œผ๋ฉฐ ์ตœ์‹  ๋ฒ„์ „์˜ ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ ๋˜๋Š” ๊ณตํ†ต ํŒŒ์ผ ๋Œ€ํ™” ์ƒ์ž์—๋Š” ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ํ†ต์ œ์˜. ์ด๊ฒƒ์€ ๋‚ด๋ถ€ ์‚ฌ์šฉ์ž ์ง€์ • ์ปจํŠธ๋กค์ด ์•„๋‹ˆ๋ผ ํ•ด๋‹น ์ปจํŠธ๋กค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์œ„์‹œ๋ฆฌ์ŠคํŠธ : ๋‚˜์—๊ฒŒ ์ข‹์€ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ ๊ธฐ๋Šฅ์ด ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. html ์„ธ๊ณ„์—์„œ ์ผ๋ถ€ ์Šคํฌ๋ฆฐ์ƒท์„ ๋นŒ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์„ ํ˜ธํ•˜๋Š” ํ–‰ ์ˆ˜๋กœ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ์‰ฝ๊ฒŒ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

1

๋ณด์ด๋Š” ์—ด ์„ ํƒ/์„ ํƒ ํ•ด์ œ , ์—ด ์ •๋ ฌ , ๋ณต์‚ฌ , ์ธ์‡„

2

๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ํ˜•์‹์œผ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

3

์—ด์„ ๋“œ๋ž˜๊ทธํ•˜์—ฌ ์—ด ์žฌ์ •๋ ฌ.

4

์—ด ํ•„ํ„ฐ๋ง

5

๊ณ ์ • ํ—ค๋” - ์Šคํฌ๋กคํ•  ๋•Œ๋„ ํ—ค๋”๊ฐ€ ๋งจ ์œ„์— ์œ ์ง€๋จ

์ž์„ธํ•œ ๋‚ด์šฉ์€ XAML ํ…œํ”Œ๋ฆฟ์ด ์žˆ๋Š” ํ–‰ ์„ธ๋ถ€์ •๋ณด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

6

ํ–‰ ๊ทธ๋ฃนํ™”

7

๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ํ–‰ ์ˆœ์„œ

8

๋‚ด ์ƒ๊ฐ์— ์œ„์˜ ๊ธฐ๋Šฅ์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ์—์„œ ํ‘œ์ค€์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

DataGrid๋ฅผ html ์„ธ๊ณ„์—์„œ ๋‹๋ณด์ด๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๋„ ํฌํ•จํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ๋ฅผ ๋ณด๊ณ  ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ์— ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชฉ๋ก ๋ณด๊ธฐ์— ์ •์ฐฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ–‰์„ ์˜†์œผ๋กœ ์Šค์™€์ดํ”„ํ•˜์—ฌ ํŽธ์ง‘ , ์‚ญ์ œ , ํ”Œ๋ž˜๊ทธ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

sideswipe

์œ„์˜ ๊ธฐ๋Šฅ์€ ์ฃผ๋กœ "๋ฐ์ดํ„ฐ ํ‘œ์‹œ"๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ WinUI์—์„œ ์—ฌ์ „ํžˆ ๋ถ€์กฑํ•œ ๊ฒƒ์€ Microsoft Pivot Control ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ WinUI ๊ธฐ๋Šฅ(control)์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

MS๋Š” ์ด๋ฏธ ์ด์— ๋Œ€ํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋‹น์‹œ์—๋Š” ์ ˆ๋Œ€์ ์œผ๋กœ ๋ฉ‹์ง„ ์ปจํŠธ๋กค์ด์—ˆ์Šต๋‹ˆ๋‹ค.

pivot1

https://www.youtube.com/watch?v=ZJIkQ9nebKY

์ด์ œ WinUI๋ฅผ ๋ชจ๋“  ๊ธฐ๋ณธ ๊ธฐ๋Šฅ๊ณผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ์œผ๋กœ ํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํ‘œ์‹œ ๋ฐ ์‹œ๊ฐํ™” ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ฉ‹์ง„ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๊ฐ•๋ ฅํ•˜๊ณ  ๋ฉ‹์ง€๊ฒŒ ๋ณด์ด๋Š” ์‹œ๊ฐ์ ์œผ๋กœ ๋งค๋ ฅ์ ์ธ ์ปจํŠธ๋กค์„ ํฌํ•จํ•ด์•ผ ํ•˜๋Š” "๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ"์˜ ํž˜์„ ์‹ค์ œ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ€ ์œ„์˜ ๊ธฐ๋Šฅ(์‹œ๊ฐํ™”) ํ›„์— ๋ฐ์ดํ„ฐ์— ๊นŠ์ด ๊ฐœ๋…์„ ์ƒ์„ฑํ•˜๊ณ  ์šฐ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ์„ฑ์ธต๊ถŒ์œผ๋กœ ์•ˆ๋‚ดํ•˜๋Š” 2D/3D ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฑด ๋‹ค๋ฅธ ๋‚ ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ))

uwp2

์ข‹์€ ์ถœ๋ฐœ์ ์€ RadDataGrid(UWP ์˜คํ”ˆ ์†Œ์Šค)๊ฐ€ ์žˆ๋Š” ํŒŒํŠธ๋„ˆ Telerik๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ๊ณ ๊ฐ ์ค‘ ํ•œ ๋ช…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์‹ค์ œ๋กœ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋น ๋ฅด๊ณ  ๋‹ค์žฌ๋‹ค๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์–ด๋ ค์šด ์ ์€ ์ฝ”๋“œ๋ฟ์ž…๋‹ˆ๋‹ค. ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ž˜ ์ดํ•ดํ•˜์ง€ ์•Š๊ณ ๋Š” ์—”์ง„์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ƒˆ๋กœ์šด DataGrid๊ฐ€ Telerik๋งŒํผ ์„ฑ๋Šฅ์ด ์ข‹์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

WinUI ํŒ€์ด DataGrid ์ปจํŠธ๋กค์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

Toolkit DataGrid๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ ์ปจํŠธ๋กค์—์„œ ๋ณด๊ณ  ์‹ถ์€ ๊ฐ€์žฅ ์‹ค์งˆ์ ์ธ ๊ฐœ์„  ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ธ๋ฑ์Šค๋กœ DataGridRow๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ
  • DataGridRows ์ž์ฒด์— ํŠน์ •ํ•œ ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด DoubleTapped ๋ฐ RightTapped.
  • ๋ถ€๋“œ๋Ÿฌ์šด ์Šคํฌ๋กค
  • ์…€ ์ด๋ฆ„ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ž…๋ ฅ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  • ํ–‰ ์•„์ด์ฝ˜์„ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ DataGridColumn
  • ์ƒ‰์ƒ ๋“ฑ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆœ์„œ๋ฅผ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ํ–‰ ์˜†์— ๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅํ•œ ์•„์ด์ฝ˜์„ ๋ฐฐ์น˜ํ•˜๋Š” ํŽธ์ง‘ ๋ฒ„ํŠผ์„ ๊ฐ–๋Š” ์˜ต์…˜์€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (Fluent์˜ ์ฃผ์š” ์†์„ฑ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊นŠ์ด์ด๊ธฐ ๋•Œ๋ฌธ์—) ๋“ค์–ด ์˜ฌ๋ ค์ง€๊ณ  ์ด๋™๋˜๋Š” ํ–‰ ๋’ค์˜ ์ผ๋ถ€ ๊ทธ๋ฆผ์ž๋ฅผ ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค. ๋“œ๋ž˜๊ทธ ์•„์ด์ฝ˜ ์˜†์— ์ž‘์€ ์œ„์•„๋ž˜ ํ™”์‚ดํ‘œ๊ฐ€ ์žˆ์œผ๋ฉด ๋งˆ์šฐ์Šค ์ž…๋ ฅ์œผ๋กœ ํ–‰์„ ๋” ์‰ฝ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ–‰์„ ์ด๋™ํ•˜๋ฉด ๋ฏธ๋ฌ˜ํ•œ ์Šฌ๋ผ์ด๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ข‹์€ ํ„ฐ์น˜๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ„ฐ์น˜ ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ํŽธ์ง‘ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ํ•„์š” ์—†์ด ํ–‰์„ ์žก๊ณ  ์ด๋™ํ•˜๋Š” ์˜ต์…˜๋„ ์ž˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด๋ฏธ ์ง€์›๋˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ์—์„œ์™€ ๊ฐ™์€ ์„ ํƒ ํ™•์ธ๋ž€์ด ํ‘œ์‹œ๋˜์–ด ์–ด๋–ค DataGrid๊ฐ€ ํ–‰ ์„ ํƒ์„ ์ง€์›ํ•˜๊ณ  ์ „์ฒด UX๋ฅผ ๊ฐœ์„ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. iOS ๋ฏธ๋ฆฌ ์•Œ๋ฆผ ์•ฑ์—๋Š” ์ด๋Ÿฌํ•œ ์•„์ด๋””์–ด ์ค‘ ์ผ๋ถ€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(์•„๋ž˜ ๊ทธ๋ฆผ์˜ ์˜ˆ). iOS ์ฃผ์‹ ์•ฑ๋„ ์ด๋™ ๊ฐ€๋Šฅํ•œ ํ–‰๊ณผ ์œ ์‚ฌํ•œ ์ข…๋ฅ˜์˜ ๊ฑฐ๋ž˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•„์ด๋””์–ด์˜ ๋Œ€๋ถ€๋ถ„์€ ๊ธฐ๋‘ฅ์—๋„ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

123456

IMG_1820 (1)

@NoahFeller ๊ทธ๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ž‘์—…์€ ๋ชฉ๋ก ๋ณด๊ธฐ์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๋“œ ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ˆœ์„œ๋ฅผ ์žฌ์ •๋ ฌํ•˜์ง€ ์•Š๊ณ  ์ •๋ ฌ ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌผ๊ฑด์„ ๋Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

*ํŽธ์ง‘ํ•˜๋‹ค
์กฐ๊ธˆ ๋” ์ƒ๊ฐํ•ด ๋ณด๋‹ˆ ๊ทธ๋Ÿฌํ•œ ์˜ต์…˜์ด ์–ด๋–ป๊ฒŒ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๊ธฐ๋ณธ ๋™์ž‘์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@NoahFeller ๊ทธ๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ž‘์—…์€ ๋ชฉ๋ก ๋ณด๊ธฐ์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๋“œ ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ˆœ์„œ๋ฅผ ์žฌ์ •๋ ฌํ•˜์ง€ ์•Š๊ณ  ์ •๋ ฌ ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌผ๊ฑด์„ ๋Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

*ํŽธ์ง‘ํ•˜๋‹ค
์กฐ๊ธˆ ๋” ์ƒ๊ฐํ•ด ๋ณด๋‹ˆ ๊ทธ๋Ÿฌํ•œ ์˜ต์…˜์ด ์–ด๋–ป๊ฒŒ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๊ธฐ๋ณธ ๋™์ž‘์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋„ค ๋งž์Šต๋‹ˆ๋‹ค @yaichenbaum. ์ €๋Š” ์ด๋Ÿฌํ•œ ์ œ์•ˆ์„ ์‚ฌ์šฉ์ž ์ •์˜ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌ์ƒํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ๋“œ๋ž˜๊ทธ๊ฐ€ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๊ธฐ๋ณธ๊ฐ’์€ ์•„๋‹ˆ์ง€๋งŒ ์˜ต์…˜์œผ๋กœ ๊ฝค ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

WPF ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ ๊ธฐ๋Šฅ์œผ๋กœ์˜ ๋‹จ์ˆœ์„ฑ. ์ €๋Š” ์‹ค์ œ๋กœ ์ง€๋‚œ ์ฃผ ๋™์•ˆ UWP ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ๊ฐ€ WPF์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด ์™”์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Datagrid๋ฅผ Dataview์— ๋ฐ”์ธ๋”ฉํ•œ ๋‹ค์Œ SQL์˜ Dataview๋ฅผ datatable.defaultview๋กœ ์ฑ„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ทธ๋ฆฌ๋“œ๋Š” ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋†€๋ผ์šธ ์ •๋„๋กœ ๊ฐ„๋‹จํ–ˆ๊ณ  ์ง€๊ธˆ๊นŒ์ง€ UWP๋Š” ์ด๊ฒƒ์„ ์—„์ฒญ๋‚˜๊ฒŒ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

ํฌ๋กœ์Šค ํ”Œ๋žซํผ์œผ๋กœ ๋งŒ๋“ค๋‹ค

๋‹จ์ผ ์…€ ์„ ํƒ ๋ชจ๋“œ, ์—‘์…€ ์Šคํƒ€์ผ์„ ์š”์ฒญํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๊ถ๊ทน์ ์ธ ๋ชฉํ‘œ๋Š” WinForms DataGridView์™€ ๊ฐ™์€ ์ •ํ™•ํ•œ ๋™์ž‘์„ ํ•˜๋Š” ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๊ฐ€์ƒํ™” ์˜ต์…˜ ๋ณด์œ (์žฌํ™œ์šฉ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜ ์Šคํฌ๋กค ๊ฐ€์ƒํ™” ์˜ต์…˜์—์„œ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง•๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฐœ๋…๊นŒ์ง€)
์ข…์ข…(์ด๋ฅผ ์ง€์›ํ•˜๋Š” ์œ ์‚ฌํ•œ ๋ฐ์Šคํฌํ†ฑ ์ปจํŠธ๋กค์—์„œ) ์ด๋Ÿฌํ•œ ์˜ต์…˜ ์ค‘ ์ผ๋ถ€๋Š” ๊ณ ์œ ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์—ด์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ํ…œํ”Œ๋ฆฟ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ๋•Œ ์‹คํŒจํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋” ๋งŽ์ด ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•˜๋ฉด Paging Control #268 ์ œ์•ˆ์„ ๋™๊ธฐํ™”ํ•˜๊ณ  ํ•„์š”ํ•œ ๋ชจ๋“  ํ›„ํฌ๋ฅผ DataGrid ์ปจํŠธ๋กค์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ข‹์€ ์†Œ์‹์ž…๋‹ˆ๋‹ค! ์ €๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ํˆดํ‚ท์— ๋“ฑ์žฅํ•œ ์ด๋ž˜๋กœ DataGrid ์ „๋ฉด์—์„œ ๊ณต์‹์ ์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ํˆดํ‚ท์— ์ข‹์€ ๋Œ€์•ˆ์ด ์—†๋Š” WinUI 3.0์—์„œ ๋ˆ„๋ฝ๋œ ๋งˆ์ง€๋ง‰ ์ปจํŠธ๋กค์ž…๋‹ˆ๋‹ค.

์ฒซ์งธ, ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ธฐ๋ณธ์ ์œผ๋กœ DataGrid์˜ WPF ๊ตฌํ˜„(์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ API๋ฅผ 100% ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค) -- Silverlight๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. WPF DataGrid๋Š” ๊ธฐ๋Šฅ์ด ํ›จ์”ฌ ๋” ์™„๋ฒฝํ–ˆ๊ณ  ํ…Œ์ŠคํŠธ์—์„œ ๋ฒ„๊ทธ๊ฐ€ ์ ์—ˆ์Šต๋‹ˆ๋‹ค.

์ปค๋ฎค๋‹ˆํ‹ฐ ํˆดํ‚ท DataGrid๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ API ์ถ”๊ฐ€๋ฅผ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ํ† ๋ก  :

  • RowPressed : ์œ„์—์„œ ๋…ผ์˜ํ•œ ๋ฐ”์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ ๋˜๋Š” ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–‰์„ ๋ˆŒ๋ €์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • RowDoublePressed : RowPressed์™€ ๋™์ผํ•˜๋ฉฐ ๋”๋ธ” ํด๋ฆญ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.
  • ColumnHeaderPressed : ์—ด ๋จธ๋ฆฌ๊ธ€์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ •๋ ฌ ๋ฐฉํ–ฅ ๋‚ด๋ถ€ ์—…๋ฐ์ดํŠธ๋ณด๋‹ค ์šฐ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ํ•„ํ„ฐ๋ง ๋ฉ”๋‰ด ๋˜๋Š” ์˜ค๋ฅธ์ชฝ ํด๋ฆญ ์˜ต์…˜์„ ํ†ตํ•ด ์—ด์„ ์ผœ๊ฑฐ๋‚˜ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ColumnHeaderDoublePressed : ColumnHeaderPressed์™€ ๋™์ผํ•˜๋ฉฐ ๋”๋ธ” ํด๋ฆญ ๋ฒ„์ „์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.
  • ColumnHeaderWidthChanged : ์‚ฌ์šฉ์ž๊ฐ€ ์—ด ๋จธ๋ฆฌ๊ธ€ ๋„ˆ๋น„์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด ์ •๋ณด๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ UI ์ƒํƒœ๋ฅผ ๋ณต์›ํ•  ๋•Œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ItemsSource๊ฐ€ ๋ณ€๊ฒฝ๋œ ํ›„ ์Šคํฌ๋กค ์œ„์น˜๋ฅผ ๋งจ ์œ„๋กœ ์žฌ์„ค์ •ํ•˜๋Š” DataGrid ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜คํ”„์…‹์ด WPF์—์„œ์ฒ˜๋Ÿผ ์œ ์ง€๋˜๋„๋ก ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ API๋„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

  • FirstRowInView() : ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” DataGrid์— ํ‘œ์‹œ๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ–‰์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • VerticalOffset : ์Šคํฌ๋กค๋ฐ”์˜ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ Get/Set
  • HorizontalOffset : ์Šคํฌ๋กค๋ฐ”์˜ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•œ Get/Set

@RBrid ๋˜ํ•œ ์—ฌ๊ธฐ ์—์„œ ์ผ๋ถ€ ๋ถ„์„์„ ๋„์™”์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ๋ฐ ๊ธฐ์กด ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ฐœ์„  ์‚ฌํ•ญ:

| ์ด๋ฒคํŠธ | ๋Œ“๊ธ€ |
| :--- | :--- |
| ContextRequestedForColumnHeader | ์—ด ๋จธ๋ฆฌ๊ธ€์„ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์œผ๋กœ ํด๋ฆญํ•  ๋•Œ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด(๋˜๋Š” ๊ธฐํƒ€ ํ”Œ๋ผ์ด์•„์›ƒ) ํ‘œ์‹œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Windows.UI.Xaml.UIElement.ContextRequested ์™€ ๋™์ผํ•˜์ง€๋งŒ ์ „์ฒด DataGrid ๋Œ€์‹  ์—ด ํ—ค๋”์šฉ์ž…๋‹ˆ๋‹ค. |
| ContextCanceledForColumnHeader | Windows.UI.Xaml.UIElement.ContextCanceled ์™€ ๋™์ผํ•˜์ง€๋งŒ ์ „์ฒด DataGrid ๋Œ€์‹  ์—ด ํ—ค๋”์šฉ์ž…๋‹ˆ๋‹ค. |
| ContextRequestedForRow | ํ–‰์„ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์œผ๋กœ ํด๋ฆญํ•  ๋•Œ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด(๋˜๋Š” ๊ธฐํƒ€ ํ”Œ๋ผ์ด์•„์›ƒ) ํ‘œ์‹œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Windows.UI.Xaml.UIElement.ContextRequested ์™€ ๋™์ผํ•˜์ง€๋งŒ ์ „์ฒด DataGrid ๋Œ€์‹  ํ–‰์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. |
| ContextCanceledForRow | Windows.UI.Xaml.UIElement.ContextCanceled ์™€ ๋™์ผํ•˜์ง€๋งŒ ์ „์ฒด DataGrid ๋Œ€์‹  ํ–‰์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. |
| RowTapped | ์ด๋ฏธ ์„ ํƒ๋œ ํ–‰์„ ํƒญํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค. |
| RowDoubleTapped | Windows.UI.Xaml.UIElement.DoubleTapped ์™€ ๋™์ผํ•˜์ง€๋งŒ ์ „์ฒด DataGrid ๋Œ€์‹  ํ–‰์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. |
| RowRightTapped | Windows.UI.Xaml.UIElement.RightTapped ์™€ ๋™์ผํ•˜์ง€๋งŒ ์ „์ฒด DataGrid ๋Œ€์‹  ํ–‰์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ContextRequestedForRow ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. |
| PointerPressedInRow | Windows.UI.Xaml.UIElement.PointerPressed ์™€ ๋™์ผํ•˜์ง€๋งŒ ์ „์ฒด DataGrid ๋Œ€์‹  ํ–‰์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. |
| PointerReleasedInRow | Windows.UI.Xaml.UIElement.PointerReleased ์™€ ๋™์ผํ•˜์ง€๋งŒ ์ „์ฒด DataGrid ๋Œ€์‹  ํ–‰์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. |
| PointerMovedInRow | Windows.UI.Xaml.UIElement.PointerMoved ์™€ ๋™์ผํ•˜์ง€๋งŒ ์ „์ฒด DataGrid ๋Œ€์‹  ํ–‰์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. PointerMovedInRow ๋Š” ํฌ์ธํ„ฐ๊ฐ€ ์บก์ฒ˜๋˜๋Š” ๋™์•ˆ์—๋งŒ ํŠธ๋ฆฌ๊ฑฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |
| ColumnHeaderTapped | ์ด๋ฏธ ์„ ํƒ๋œ ์—ด ๋จธ๋ฆฌ๊ธ€์„ ํƒญํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. |
| ColumnHeaderDoubleTapped | Windows.UI.Xaml.UIElement.DoubleTapped ์™€ ๋™์ผํ•˜์ง€๋งŒ ์ „์ฒด DataGrid ๋Œ€์‹  ์—ด ํ—ค๋”์šฉ์ž…๋‹ˆ๋‹ค. |
| ColumnHeaderRightTapped | Windows.UI.Xaml.UIElement.RightTapped ์™€ ๋™์ผํ•˜์ง€๋งŒ ์ „์ฒด DataGrid ๋Œ€์‹  ์—ด ๋จธ๋ฆฌ๊ธ€์šฉ์ž…๋‹ˆ๋‹ค. ContextRequestedForColumnHeader ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. |
| ColumnHeaderWidthChanged | ๋˜๋Š” ColumnHeaderResized ๋กœ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์ธ์ˆ˜์— ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€ ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ถ€์šธ ์†์„ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์ด๋ฒคํŠธ ์ธ์ˆ˜๋Š” ํฌ๊ธฐ๊ฐ€ ์กฐ์ •/๋ณ€๊ฒฝ๋œ ์—ด ํ—ค๋”๋„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. |
| SortOrderChanged | ์„ ํƒํ•œ ์—ด ํ—ค๋” ๋ชฉ๋ก์ด ๋ณ€๊ฒฝ๋  ๋•Œ ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ ํƒํ•œ ์—ด์ด ์˜ค๋ฆ„์ฐจ์ˆœ๊ณผ ๋‚ด๋ฆผ์ฐจ์ˆœ ์‚ฌ์ด์—์„œ ์ „ํ™˜๋  ๋•Œ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ args์— ์ •๋ ฌ ์ˆœ์„œ๊ฐ€ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ถ€์šธ ์†์„ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ด๋ฒคํŠธ Sorting ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ •๋ ฌ์ด ์ทจ์†Œ๋˜์ง€ ์•Š์œผ๋ฉด Sorting ์ด๋ฒคํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋œ ํ›„ ์ƒˆ ์ด๋ฒคํŠธ SortOrderChanged ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. |
| Sorting | ์ด๋ฏธ ์กด์žฌํ•˜์ง€๋งŒ ์ •๋ ฌ ์š”์ฒญ์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์ • ๊ฐ€๋Šฅํ•œ ๋ถ€์šธ ์†์„ฑ์„ ์ด๋ฒคํŠธ ์ธ์ˆ˜์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ •๋ ฌ์ด ์ž˜๋ชป๋˜์—ˆ๊ฑฐ๋‚˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์–ด ์ทจ์†Œํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ถ€์šธ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ •๋ ฌ์„ ์š”์ฒญํ–ˆ๋Š”์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญํ–ˆ๋Š”์ง€ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. |
| ColumnSortDirectionChanged | ์ด ์ด๋ฒคํŠธ๋Š” ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์•ž์„œ ์–ธ๊ธ‰ํ•œ SortOrderChanged ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด, ์ •๋ ฌ ๋ฐฉํ–ฅ์ด ๋ณ€๊ฒฝ๋  ๋•Œ SortOrderChanged ๋„ ํ•จ๊ป˜ ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฉด ๋ถˆํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |
| ColumnDisplayIndexChanged | ์ด๋ฏธ ์กด์žฌํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ถ€์šธ ์†์„ฑ(์ด๋ฒคํŠธ ์ธ์ˆ˜์—์„œ)์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ ColumnDisplayIndexChanged ๋ฐ ColumnReordered ์ด๋ฒคํŠธ๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ๋ฌธ์„œํ™”ํ•˜์‹ญ์‹œ์˜ค. ๋˜๋Š” ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค. |
| ColumnReordered | ์ด๋ฏธ ์กด์žฌํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ถ€์šธ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. |
| SelectionChanged | ์ด๋ฏธ ์กด์žฌํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ถ€์šธ ์†์„ฑ(์ด๋ฒคํŠธ ์ธ์ˆ˜์—์„œ)์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. |
| CopyingRowClipboardContent | ์ด๋ฏธ ์กด์žฌํ•˜์ง€๋งŒ ๋ณต์‚ฌ ๋Œ€์‹  ์ž‘์—…์„ ์ž˜๋ผ๋‚ผ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ถ€์šธ ์†์„ฑ์„ ์ด๋ฒคํŠธ ์ธ์ˆ˜์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋˜๋Š” ์ปท์„ ์œ„ํ•ด ๋ณ„๋„์˜ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. |
| CuttingRowClipboardContent | ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ–‰์„ ์ž๋ฅด๋ ค๊ณ  ํ•  ๋•Œ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค(control-X ํ•ซํ‚ค, ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด ๋“ฑ์„ ํ†ตํ•ด). ๋˜๋Š” CopyingRowClipboardContent ๊ฐ€ ๋ณต์‚ฌ ๋ฐ ์ž˜๋ผ๋‚ด๊ธฐ ์—ฐ์‚ฐ ๋ชจ๋‘์— ๋Œ€ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋„๋ก ํ•˜๋Š” ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ถ€์šธ ์†์„ฑ์„ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. |
| PastingRowClipboardContent | ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ์‹œ๋„ํ•  ๋•Œ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค(control-V ๋‹จ์ถ•ํ‚ค, ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด ๋“ฑ์„ ํ†ตํ•ด). |

๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์€ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ํ–‰์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐฑ๋งŒ ๊ฐœ ์ด์ƒ์˜ ํ–‰์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ISupportIncrementalLoading ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋กค ๋ง‰๋Œ€๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋กœ๋“œํ•œ ํ–‰์˜ ์ˆ˜(์ด ์นด์šดํŠธ๊ฐ€ ์•„๋‹˜)๋งŒ ๋ฐ˜์˜ํ•˜๊ณ  100๋งŒ ํ–‰์— ๋„๋‹ฌํ•˜๋ ค๋ฉด ๋๊นŒ์ง€ ์Šคํฌ๋กคํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ ์  ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 100๋งŒ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ์— ์ด๋ฅผ ์•Œ๋ฆฌ๊ณ  ๋น ๋ฅด๊ฒŒ ์Šคํฌ๋กคํ•˜๊ฑฐ๋‚˜ ๋๊นŒ์ง€ ์ด๋™ํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ๋ช‡ ํ–‰๋งŒ ์ œ๊ณตํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ–‰ ๋ชฉ๋ก์„ ์Šคํฌ๋กคํ•˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด ๋ณด์‹ญ์‹œ์˜ค.

๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์€ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ํ–‰์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐฑ๋งŒ ๊ฐœ ์ด์ƒ์˜ ํ–‰์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ISupportIncrementalLoading ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋กค ๋ง‰๋Œ€๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋กœ๋“œํ•œ ํ–‰์˜ ์ˆ˜(์ด ์นด์šดํŠธ๊ฐ€ ์•„๋‹˜)๋งŒ ๋ฐ˜์˜ํ•˜๊ณ  100๋งŒ ํ–‰์— ๋„๋‹ฌํ•˜๋ ค๋ฉด ๋๊นŒ์ง€ ์Šคํฌ๋กคํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ ์  ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 100๋งŒ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ์— ์ด๋ฅผ ์•Œ๋ฆฌ๊ณ  ๋น ๋ฅด๊ฒŒ ์Šคํฌ๋กคํ•˜๊ฑฐ๋‚˜ ๋๊นŒ์ง€ ์ด๋™ํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ๋ช‡ ํ–‰๋งŒ ์ œ๊ณตํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ–‰ ๋ชฉ๋ก์„ ์Šคํฌ๋กคํ•˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด ๋ณด์‹ญ์‹œ์˜ค.

์ด๊ฒƒ.

'ํ˜„๋Œ€์ '์€ ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๋‹ค๋Š” ์˜๋ฏธ์ด๋ฉฐ, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์•ฑ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜๋งŽ์€ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜์—ฌ ์ ์ ˆํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ๊ณ  ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŽ˜์ด์ง•, ์ •๋ ฌ, ๋น„๋™๊ธฐ ์ฆ๋ถ„ ๋กœ๋”ฉ, ๋์—†๋Š” ์Šคํฌ๋กค - ์ด ๋ชจ๋“  ๊ฒƒ์ด ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐ์Šคํฌํƒ‘ ์•ฑ์˜ ํ•„์ˆ˜ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

MS๋Š” ์ƒˆ๋กœ์šด ๊ทธ๋ฆฌ๋“œ์—์„œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ•์กฐํ•˜๋Š” ์ƒ˜ํ”Œ ์•ฑ์„ ์ œ์ž‘ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ฐœ๋ฐœ์ž๋กœ๋ถ€ํ„ฐ ํ”ผ๋“œ๋ฐฑ์„ ์ˆ˜์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํšจ๊ณผ๋ฅผ ์ž…์ฆํ•˜๊ธฐ ์œ„ํ•ด World Wide Importers์™€ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ ์‹คํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

@dotMorten

๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์€ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ํ–‰์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐฑ๋งŒ ๊ฐœ ์ด์ƒ์˜ ํ–‰์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ €๋„ ๊ทธ๋Ÿฌ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ฐฑ๋งŒ ๊ฐœ์˜ ํ–‰์„ ์ง€์›ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก(์ฆ‰, ์™„์ „ํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์Œ) DataGrid์—์„œ ํ˜„์žฌ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๊ธฐ์ˆ ์„ ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ˜„์žฌ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ด ํ•„์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๋‚ด ์ง€์‹์ด ์ตœ์‹  ๋ฒ„์ „์˜ DataGrid์— ๋Œ€ํ•ด ๋” ์ด์ƒ ์ตœ์‹  ์ •๋ณด๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์ œ์™ธ). DataGrid๋Š” ํ‘œ์‹œ๋˜๋Š” ๊ฐ ํ–‰์˜ ๊ฐ ์…€/์—ด์— ๋Œ€ํ•œ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์œ ์ผํ•œ ์ง€์› ๋ฐฉ๋ฒ•์œผ๋กœ Windows.UI.Xaml.Data.Binding ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

DataGrid์—์„œ DataGrid๊ฐ€ ํ–‰์˜ ์…€/์—ด ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค DataGrid๊ฐ€ ํ˜ธ์ถœํ•  ๋Œ€๋ฆฌ์ž ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ธ์Šคํ„ด์Šค๋ฅผ DataGrid์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ง€์ •๋œ ํ–‰์— ๋Œ€ํ•ด).

์ด์ƒ์ ์œผ๋กœ(๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ) DataGrid๋Š” ์ด ๋Œ€๋ฆฌ์ž ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋น„๋™๊ธฐ์  ์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋Œ€๋ฆฌ์ž ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์š”์ฒญ๋œ ๊ฐ’์„ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  Task ๋˜๋Š” IAsyncOperation<TResult> ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” DataGrid๊ฐ€ ๋‹ค์Œ ์ ˆ์ฐจ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ Task ๋ฐ IAsyncOperation<TResult> ์—†์ด ๋น„๋™๊ธฐ์‹ ์ง€์›๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  1. DataGrid๋Š” ํ–‰ ID 50001์—์„œ ์…€/์—ด 5์˜ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” DataGrid๋Š” ํ–‰ ID 50001์— ๋Œ€ํ•œ ๋ชจ๋“  ์—ด ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. DataGrid๋Š” DataGrid๊ฐ€ ์ง€์ •๋œ ์—ด/ํ–‰ ๋˜๋Š” ์ „์ฒด ํ–‰์˜ ๋ฐ์ดํ„ฐ ๊ฐ’ ๋กœ๋“œ๋ฅผ ์š”์ฒญํ–ˆ์Œ์„ ์•ฑ์— ์•Œ๋ฆฌ๋Š” ๋Œ€๋ฆฌ์ž ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ธ์Šคํ„ด์Šค ๋˜๋Š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  3. ์•ฑ์€ ์š”์ฒญ๋œ ํ–‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์•ฑ์ด ์š”์ฒญ๋œ ํ–‰ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์€ DataGrid์— ํ–‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” DataGrid์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  5. DataGrid๋Š” ํ–‰ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์šฐ์„  ์™€์šฐ!! ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•ด์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์•„๋ž˜์— ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ๋‹ต๋ณ€์ด ์žˆ์ง€๋งŒ ์ „๋ฐ˜์ ์œผ๋กœ ์ €๋Š” ์ด๋Ÿฌํ•œ ์˜๊ฒฌ์„ ๋งŽ์ด ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ฉ‹์ง„ ํ˜„๋Œ€์‹ DataGrid๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋“ฃ๋Š” ๊ฒƒ์„ ์ •๋ง ์ฆ๊ธฐ๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ณ„์† ์˜ค์„ธ์š”!

@Pinox ์ž์„ธํ•œ ๋‹ต๋ณ€๊ณผ ์Šคํฌ๋ฆฐ์ƒท์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์œ„์‹œ๋ฆฌ์ŠคํŠธ๋Š” ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค(ํŠนํžˆ ๋ฉ‹์ง„ ์• ๋‹ˆ๋ฉ”์ด์…˜!) - html์— ์žˆ๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ์ข‹์€ ์˜๊ฐ์„ ์ฃผ๊ณ  ๋‹จ์ˆœํ•˜์ง€๋งŒ ์‚ถ์˜ ์งˆ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ์˜๊ฒฌ์„ ํ™•์‹คํžˆ ์ €์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

@verelpode , @robloo , @duke7553 DataGrid ๊ด€๋ จ ์ด๋ฒคํŠธ์— ์˜ˆ์ž…๋‹ˆ๋‹ค! ๋‹น์‹ ์ด ์ด๊ฒƒ๋“ค์— ๋„ฃ์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ชจ๋‘ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ„ฐ์น˜ ์šฐ์„  ๋ฐ ๋‹ค์–‘ํ•œ ์ž…๋ ฅ์„ ์œ„ํ•ด ๋””์ž์ธํ•  ๋•Œ ์ด์™€ ๊ฐ™์€ ์ด๋ฒคํŠธ๋Š” ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

@dotMorten , @jkewley , @verelpode ์„ฑ๋Šฅ์€ ํ™•์‹คํžˆ ์ด ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š” ๋™๊ธฐ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๊ฐ€์ƒํ™” ์Šคํ† ๋ฆฌ์™€ ItemsRepeater์™€ ๊ฐ™์€ ์ตœ์‹  ์ปจํŠธ๋กค์˜ ์‚ฌ์šฉ์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•˜๋ ค๋Š” ์ฃผ์š” ๊ฐœ์„  ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋˜๋ฉด ๊ณ„์† ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ์•ˆํ•˜์‹  ์„ธ๋ถ€ ์ •๋ณด์— ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@Laz3rPanth3r , @robloo , @keeganatorr WPF ๋ฐ ๊ธฐํƒ€ UI ํ”„๋ ˆ์ž„์›Œํฌ์— ์†ํ•˜๋Š” DataGrid๋ฅผ ์ข‹์•„ํ•œ๋‹ค๋Š” ๊ท€ํ•˜์˜ ์†Œ๋ฆฌ๋ฅผ ๋ถ„๋ช…ํžˆ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ƒˆ๋กœ ๊ณ ์นจ์—์„œ ์ด๋ฅผ ํ™•์‹คํžˆ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

DataGrid์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ์ž‘์—…๊ณผ ํ”ผ๋“œ๋ฐฑ ์š”์ฒญ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ๋œ ๊ฐœ์„  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

DataGridColumn์˜ ๋” ๋งŽ์€ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

DataGridColumn ์˜ ํ˜„์žฌ ํ•˜์œ„ ํด๋ž˜์Šค/๊ตฌํ˜„์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. DataGridColumn ์˜ ๋‹ค์Œ ์ƒˆ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

| ์ œ์•ˆ๋œ ํ•˜์œ„ ํด๋ž˜์Šค | ์„ค๋ช… |
| :--- | :--- |
| ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ ์•„์ด์ฝ˜ ์—ด โ€‹โ€‹| ์ผ๋ฐ˜์ ์ธ ์š”๊ตฌ ๋•Œ๋ฌธ์— I์ด ์ œ์ž‘ ์ œ์•ˆ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ํ–‰์˜ ์•„์ด์ฝ˜์„ ํ‘œ์‹œํ•˜๋Š” DataGridColumn ์„œ๋ธŒ๋ผ๋Š” DataGridIconColumn ์— ํƒ€์ž… ๋ณ€ํ™˜์ด ๊ฒ€์ƒ‰๋œ ์…€ ๊ฐ’ Windows.UI.Xaml.Controls.IconSource ๋ฐ ๋ Œ๋”๋ง IconSource ์ธ์Šคํ„ด์Šค(๊ฐ ์…€์—์„œ ๋‹ค๋ฅธ IconSource ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ Œ๋”๋ง๋จ). |
| ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ ์ด๋ฏธ์ง€ ์—ด | DataGridImageColumn (๊ฐ€) ์ œ์•ˆ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผ DataGridIconColumn ์ด ๋ Œ๋”๋งํ•ด์•ผํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  Windows.UI.Xaml.Media.ImageSource ๋Œ€์‹  Windows.UI.Xaml.Controls.IconSource . |
| ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ ๋‚ ์งœ ์‹œ๊ฐ„ ์—ด | ์„ค์ •์— ๋”ฐ๋ผ ๋‚ ์งœ ๋ฐ/๋˜๋Š” ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์…€ ๊ฐ’์„ System.DateTimeOffset ๋˜๋Š” System.DateTime (๋‘˜ ๋‹ค ์ง€์›๋จ)๋กœ Typecastํ•˜๊ณ  ์…€์— ํ‘œ์‹œํ•  ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋กœ์˜ ๋ณ€ํ™˜์€ DataGridDateTimeColumn ํด๋ž˜์Šค์˜ ์„œ์‹ ์„ค์ •/์†์„ฑ์œผ๋กœ ์ œ์–ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋‚ ์งœ/์‹œ๊ฐ„๋ณ„ ์ •๋ ฌ๋„ ์ง€์›๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. |
| ๋ฐ์ดํ„ฐ๊ทธ๋ฆฌ๋“œํƒ€์ž„์ŠคํŒฌ์ปฌ๋Ÿผ | ์…€ ๊ฐ’์„ System.TimeSpan ๋กœ Typecastํ•˜๊ณ  ์…€์— ํ‘œ์‹œํ•  ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋กœ์˜ ๋ณ€ํ™˜์€ DataGridTimeSpanColumn ํด๋ž˜์Šค์˜ ์„œ์‹ ์„ค์ •/์†์„ฑ์— ์˜ํ•ด ์ œ์–ด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์ •๋ ฌ๋„ ์ง€์›๋˜์–ด์•ผ ํ•˜๋ฉฐ ํ‘œ์‹œ๋œ ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ TimeSpan ์ธ์Šคํ„ด์Šค๋ฅผ ์ •๋ ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. |
| ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ ์—ด | ์…€ ๊ฐ’์„ System.Int64 , UInt64 , Int32 ๋˜๋Š” UInt32 (๋ชจ๋‘ ์ง€์›๋จ)๋กœ ์œ ํ˜• ๋ณ€ํ™˜ํ•˜๊ณ  ๋ฐ”์ดํŠธ ํฌ๊ธฐ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค(ํ…์ŠคํŠธ ) ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 1572864/1024/1024 = 1.5์ด๋ฏ€๋กœ 1572864๋Š” "1.5MB"๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋กœ์˜ ๋ณ€ํ™˜์€ DataGridDataSizeColumn ํด๋ž˜์Šค์˜ ์„ค์ •/์†์„ฑ์— ์˜ํ•ด ์ œ์–ด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์‹œ๋œ ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ์›๋ž˜ ์ •์ˆ˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. |
| ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ ์‚ฌ์šฉ์ž ์ •์˜ ์—ด | ์ด๋Š” ๊ธฐ์กด์˜ ์œ ์‚ฌ ์ž‘๋™ํ•ด์•ผ DataGridTemplateColumn ํฌํ•จํ•˜์ง€ ์•Š๋Š” ์ œ์™ธํ•˜๊ณ  Windows.UI.Xaml.DataTemplate . ํ‘œ์‹œ๋œ GUI ์š”์†Œ ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑ ๋ฐ/๋˜๋Š” ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ๋Œ€๋ฆฌ์ž/์ฝœ๋ฐฑ ๋˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. |
| ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ ํ…์ŠคํŠธ ์—ด | ์ด๋ฏธ ์กด์žฌํ•˜์ง€๋งŒ ์•ฑ์ด ๊ฐœ์ฒด์—์„œ ํ…์ŠคํŠธ๋กœ์˜ ๋ณ€ํ™˜ ๋ฐ ์ •๋ ฌ์„ ์œ„ํ•œ ๋น„๊ต ๊ธฐ๋Šฅ์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์†์„ฑ์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋‚˜์ค‘์— ๋‚ด ๋ฉ”์‹œ์ง€์—์„œ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. |

DataGridCustomColumn ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

public class DataGridCustomColumn : DataGridColumn
{
    public event EventHandler<DataGridDisplayingCellEventArgs> DisplayingCell;
}

public class DataGridDisplayingCellEventArgs : EventArgs
{
    public DataGridColumn Column { get; }
    public object CellValue { get; }
    public Windows.UI.Xaml.UIElement CellUIElement { get; set; } // settable
}

๋•Œ ์ด๋ฒคํŠธ DataGridCustomColumn.DisplayingCell ํŠธ๋ฆฌ๊ฑฐ, ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ž์ฒด ์—…๋ฐ์ดํŠธํ•ด์•ผ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ UIElement ํ•˜์œ„ ํŠธ๋ฆฌ๊ฐ€ ํ‘œ์‹œ DataGridDisplayingCellEventArgs.CellValue ํ•˜๊ณ  ์†์„ฑ ์„ค์ • DataGridDisplayingCellEventArgs.CellUIElement ์ด์— UIElement ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด DataGrid๊ฐ€ ์ด๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์— DataGrid๊ฐ€ ์ด ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•  ๋•Œ DataGrid๋Š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ์žฌ์‚ฌ์šฉ/์žฌํ™œ์šฉ ๋ฐ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก DataGridDisplayingCellEventArgs.CellUIElement ์†์„ฑ์„ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ์— ์˜ํ•ด ์ด์ „์— ์ƒ์„ฑ๋œ UIElement ์ธ์Šคํ„ด์Šค๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ UIElement ํ•˜์œ„ ํŠธ๋ฆฌ( DataGridDisplayingCellEventArgs.CellValue ๋‹ค๋ฅธ ๊ฐ’์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ). ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋™์ผํ•œ UIElement ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ์žฌํ™œ์šฉํ•˜๊ฑฐ๋‚˜ DataGridDisplayingCellEventArgs.CellUIElement ์†์„ฑ์„ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ UIElement ํ•˜์œ„ ํŠธ๋ฆฌ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ•˜์œ„ ํด๋ž˜์Šค DataGridCustomColumn ๋ฅผ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ๊ธฐ๋ณธ ํด๋ž˜์Šค DataGridColumn ์—์„œ ์ง์ ‘ ์ƒˆ๋กœ์šด DisplayingCell ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋”ฐ๋ผ์„œ DataGridColumn.DisplayingCell ์ด๋ฒคํŠธ๋Š” DataGridColumn ์˜ ๋ชจ๋“  ํ•˜์œ„ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์ƒ์„ฑ๋œ UIElement ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋˜๋Š” ์žฌ์ •์˜๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด DataGridTextColumn ์—์„œ ํ˜„์žฌ ์…€ ๊ฐ’/๊ฐœ์ฒด๋Š” System.Object.ToString ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ‘œ์‹œํ•  ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์•ฑ์ด ์ด ๊ฐ’์—์„œ ํ…์ŠคํŠธ๋กœ์˜ ๋ณ€ํ™˜์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ„์ž„/์ฝœ๋ฐฑ ๋˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์•ฑ์ด System.Collections.IComparer ์ธ์Šคํ„ด์Šค๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ •๋ ฌ ๋™์ž‘์„ ์žฌ์ •์˜ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ์†์„ฑ๋„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

public class DataGridTextColumn : DataGridColumn
{
    public System.Collections.IComparer Comparer { get; set; }
    public DataGridCellValueToToStringConverter CellValueToToStringConverter { get; set; }
}

public delegate string DataGridCellValueToToStringConverter(object sourceObject);

๋Œ€์‹  ๋งŒ๋“œ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ, Comparer ์žฌ์‚ฐ์„ DataGridTextColumn , ์ œ์ž‘์˜ ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ ค Comparer ๊ธฐ๋ณธ ํด๋ž˜์Šค์—์„œ ์ง์ ‘ ์†์„ฑ์„ DataGridColumn ์ˆ˜ ์žˆ๋„๋กํ•˜๊ธฐ ์œ„ํ•ด, DataGridColumn ์˜ ๋ชจ๋“  ํ•˜์œ„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ •๋ ฌ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹์•ฑ.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ CellValueToToStringConverter ์†์„ฑ์€ ๊ธฐ๋ณธ ํด๋ž˜์Šค DataGridColumn ์—์„œ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DataGridColumn ํ•˜์œ„ ํด๋ž˜์Šค์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ์…€ ๊ฐ’์„ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ. ์˜ˆ๋ฅผ ๋“ค์–ด ํ–‰์„ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌํ•  ๋•Œ ๊ฐ ์…€ ๊ฐ’์„ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (ํ…์ŠคํŠธ ํ˜•์‹๊ณผ ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ํ˜•์‹ ๋ชจ๋‘ ํด๋ฆฝ๋ณด๋“œ์— ๋™์‹œ์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ์•ฑ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.)

DataGridIconColumn ๋˜๋Š” DataGridImageColumn ์„ ํƒ ์‹œ ๋‹ค์‹œ ์ •๋ ฌ: ๋ถ„๋ช…ํžˆ DataGrid๋Š” ์•„์ด์ฝ˜์ด๋‚˜ ์ด๋ฏธ์ง€๋ฅผ ์ •๋ ฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹ค์Œ ์†”๋ฃจ์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ DataGridIconColumn ๋˜๋Š” DataGridImageColumn ์œ ํ˜•์˜ ์—ด ํ—ค๋”๋ฅผ ์„ ํƒ(์ •๋ ฌ ๊ธฐ์ค€)ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • IconSource ํด๋ž˜์Šค์—์„œ AlternativeText ์†์„ฑ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. DataGridIconColumn ๊ฐ€ ํ–‰์„ ์ •๋ ฌํ•˜๊ฑฐ๋‚˜ ํด๋ฆฝ๋ณด๋“œ/๋ณต์‚ฌ๋ณธ์„ ์œ„ํ•ด ์…€์„ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ AlternativeText ์†์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • DataGridColumn ๋˜๋Š” DataGridIconColumn ์—์„œ ์„ค์ • ๊ฐ€๋Šฅํ•œ Comparer ์†์„ฑ( System.Collections.IComparer ์œ ํ˜•)์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์„ ํƒํ•œ ํ–‰/ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค

ํ˜„์žฌ ๊ธฐ๋Šฅ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์„ ํƒํ•œ ํ–‰/ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์„ค์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ํ˜„์žฌ ๋‹ค์Œ ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

public int SelectedIndex { get; set; }
public object SelectedItem { get; set; }
public System.Collections.IList SelectedItems { get; }

์„ ํƒํ•œ ํ–‰์˜ DataGridRow ์ธ์Šคํ„ด์Šค์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ DataGrid์— ๋‹ค์Œ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

public DataGridRow SelectedRow { get; set; }
public IList<DataGridRow> SelectedRows { get; }

๋˜๋Š” ์œ„์˜ ๋‚ด์šฉ์„ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ค์šด ๊ฒฝ์šฐ ๋‹ค์Œ ์ฝ๊ธฐ ์ „์šฉ ๋ณ€ํ˜•์ด ๋œ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

public DataGridRow SelectedRow { get; }
public IReadOnlyCollection<DataGridRow> SelectedRows { get; }

DataGridRow ์ธ์Šคํ„ด์Šค๊ฐ€ ์žฌํ™œ์šฉ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์œ„ ์†์„ฑ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋Š” ๋ฐ˜ํ™˜๋œ ์ •๋ณด๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ๋งŒ ์œ ํšจํ•˜๋ฏ€๋กœ ์ฆ‰์‹œ ์ฝ๊ณ /์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ ๋” ์˜ค๋žœ ๊ธฐ๊ฐ„ ๋™์•ˆ ์œ ์ง€ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ๊ฒฝ๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ์กด์˜ SelectedIndex ์†์„ฑ์€ ํ•˜๋‚˜์˜ ์„ ํƒ๋œ ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ์„ ํƒํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์–ป๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋”ฐ๋ผ์„œ ๋‹ค์Œ SelectedIndexes ์†์„ฑ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

public IList<int> SelectedIndexes { get; } // Suggestion.
public int SelectedIndex { get; set; } // Already exists.

๊ฐœ์ธ์ ์œผ๋กœ DataGrid๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ณ  "์ธ๋ฑ์Šค"๋ผ๋Š” ์šฉ์–ด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— "SelectedIndex"๋ผ๋Š” ์ด๋ฆ„์ด ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†์„ฑ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค:

public IList<int> SelectedOrdinals { get; }
public int SelectedOrdinal { get; set; }

๋˜ํ•œ ์ง€์ •๋œ DataGridRow ๋ฐ/๋˜๋Š” DataGridColumn์„ ๋ณด๊ธฐ๋กœ ์Šคํฌ๋กคํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค:

public void ScrollIntoView(object item, DataGridColumn column);

๊ธฐ์กด ScrollIntoView ๋ฐฉ๋ฒ•์„ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

public void ScrollIntoView(DataGridRow row, DataGridColumn column);
public void ScrollItemIntoView(object item, DataGridColumn column);

ํ•œ ๋ฒˆ์— ์ •๋ ฌ ์ˆœ์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ์„ค์ •

์•ฑ์„ ์—ด๊ณ  ๋‹ซ์„ ๋•Œ ์ •๋ ฌ ์ˆœ์„œ ๋ฐ ๊ธฐํƒ€ ์„ค์ •์„ ํฌํ•จํ•˜์—ฌ ์ตœ์ข… ์‚ฌ์šฉ์ž์˜ DataGrid ๊ตฌ์„ฑ์„ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์—ด์˜ ๋ชฉ๋ก์„ ์˜๋ฏธํ•˜๋Š” ์ •๋ ฌ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ผ ์—ด์ด ์•„๋‹Œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜ ์ด์ƒ์˜ ์—ด์ด ๋™์‹œ์— ์„ ํƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ •๋ ฌ์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์—ด, ์ •๋ ฌ์„ ์œ„ํ•œ ๋‘ ๋ฒˆ์งธ ์—ด, ์ •๋ ฌ์„ ์œ„ํ•œ ์„ธ ๋ฒˆ์งธ ์—ด ๋“ฑ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ DataGrid์—์„œ ๋‹ค์Œ ์†์„ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ์ด๊ฒƒ์€ ์ฒซ ๋ฒˆ์งธ ์•„์ด๋””์–ด์ผ ๋ฟ์ด๋ฉฐ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

public IReadOnlyList<DataGridColumn> SortOrder { get; set; }

์œ„์˜ ๋ฐฉ๋ฒ•์€ ํ•œ ๋ฒˆ์˜ ํžˆํŠธ์—์„œ ๊ฐ ์—ด์˜ DataGridColumn.SortDirection ์ €์žฅ ๋ฐ ๋ณต์›์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ฑ์ด ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ œ์•ˆ๋œ SortOrder ์†์„ฑ์„ ์„ ํƒํ•œ ์—ด ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ์„ ํƒํ•œ ๊ฐ ์—ด์˜ SortDirection ์†์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(๊ฐ ์—ด์— ๋Œ€ํ•ด ์ด ๋‹จ๊ณ„ ๋ฐ˜๋ณต).

์ด๋Š” ์—ฌ๋Ÿฌ ํžˆํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, DataGrid์˜ ์—ฌ๋Ÿฌ ์‹œ๊ฐ„ ์†Œ๋ชจ์ ์ธ ๋ฆฌ์กฐํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข… ์‚ฌ์šฉ์ž๋Š” DataGrid๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์—ฌ๋Ÿฌ ๋ฒˆ ์žฌ์ •๋ ฌ๋  ๋•Œ ๋งŽ์€ ์ˆ˜์˜ ํ–‰์„ ํฌํ•จํ•˜๋Š” DataGrid์—์„œ ์ƒ๋‹นํ•œ ์ง€์—ฐ์„ ์ธ์ง€ํ•˜๊ณ  ๊ฒช์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์•ฑ์ด ํ•œ ๋ฒˆ์˜ ํžˆํŠธ๋กœ ์™„์ „ํ•œ ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ๋ณต์›ํ•˜๊ณ  ๋‹จ์ผ ๋ฆฌ์กฐํŠธ ์ด์ƒ์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋‹ค์Œ ์†”๋ฃจ์…˜์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

public class DataGrid
{
    public IReadOnlyList<DataGridColumnAndDirection> SortOrder { get; set; }
    ...
}

public struct DataGridColumnAndDirection
{
    public readonly DataGridColumn Column;
    public readonly DataGridSortDirection SortDirection;
    public DataGridColumnAndDirection(DataGridColumn, DataGridSortDirection) { ... }
}

์ฐธ๊ณ  ๋‚˜๋Š” ์˜๋„์ ์œผ๋กœ ์“ด IReadOnlyList<DataGridColumnAndDirection> ํ•˜์ง€ IList<DataGridColumnAndDirection> ์• ํ”Œ ๋ฆฌ์ผ€์ด์…˜์— ์˜ํ•ด ๋ฐ˜ํ™˜ ๋œ ๋ชฉ๋ก์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹คํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ SortOrder ์†์„ฑ์„. ๋ชฉ๋ก์„ ์ˆ˜์ •ํ•˜๋Š” ๋Œ€์‹  ์•ฑ์€ SortOrder ์†์„ฑ์„ DataGrid์—์„œ ๋ณต์‚ฌํ•˜์—ฌ ์ „์ฒด ์ •๋ ฌ ์ˆœ์„œ ๋ชฉ๋ก์„ ์™„์ „ํžˆ ๋ฐ”๊พธ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•œ ๋ฒˆ์— ์ž‘๋™ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ฐ’๋น„์‹ผ ๋ฆฌ์กฐํŠธ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DataGrid.SortOrder ๊ฐ€ ์ƒˆ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •๋˜๋ฉด DataGrid๋Š” ์ƒˆ SortOrder ๋ชฉ๋ก์˜ ๊ฐ ์—ด์— ํ•ด๋‹น DataGridColumn.SortDirection ์†์„ฑ๋„ ์„ค์ •ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๋ฆฌ์กฐํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ DataGrid.SortOrder[i].SortDirection ๋Š” DataGridColumn.SortDirection .

ํ•œ ๋ฒˆ์˜ ํžˆํŠธ๋กœ ํ‘œ์‹œ๋œ ์—ด ์ˆœ์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ์„ค์ •

์•ฑ์„ ์—ด๊ณ  ๋‹ซ์„ ๋•Œ, ๊ฐ€๊ธ‰์ ์ด๋ฉด ํ•œ ๋ฒˆ์˜ ํžˆํŠธ๋กœ ์ตœ์ข… ์‚ฌ์šฉ์ž์˜ ์—ด ์ˆœ์„œ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์†์„ฑ DataGridColumn.DisplayIndex ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๋ก ์ ์œผ๋กœ ์•ฑ์€ DataGrid.Columns ๋ชจ๋“  ์—ด์„ ๋ฐ˜๋ณตํ•˜๊ณ  ๊ฐ๊ฐ์˜ DisplayIndex ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ตœ์ข… ์‚ฌ์šฉ์ž์˜ ๊ตฌ์„ฑ์„ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•ฑ์ด ์ผ์‹œ์ ์œผ๋กœ ํ•œ ์—ด์˜ DisplayIndex ๋ฅผ ๋‹ค๋ฅธ ์—ด์˜ ๋™์ผํ•œ DisplayIndex ๋กœ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ DisplayIndex ๊ฐ€ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•œ ๋ฒˆ์˜ ํžˆํŠธ๋กœ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์œผ๋ฉด ๊ฐ’๋น„์‹ผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ ๋ฐ/๋˜๋Š” ์žฌ๊ณ„์‚ฐ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ DataGrid์—์„œ ColumnDisplayOrder ์†์„ฑ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

public IReadOnlyList<DataGridColumn> ColumnDisplayOrder { get; set; }

์ด์ „์— SortOrder ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ColumnDisplayOrder ์€ ํ•œ ๋ฒˆ์˜ ํžˆํŠธ๋กœ ์ž‘๋™ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— IList<DataGridColumn> ์•„๋‹Œ ์˜๋„์ ์œผ๋กœ IReadOnlyList<DataGridColumn> ์ž…๋‹ˆ๋‹ค.
DataGrid.ColumnDisplayOrder ๊ฐ€ ์ƒˆ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •๋˜๋ฉด DataGrid๋Š” ์ผ์น˜ํ•˜๋„๋ก ๊ฐ ์—ด์˜ DataGridColumn.DisplayIndex ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์—ด์„ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ํ‘œ์‹œํ•˜๋„๋ก ํ—ˆ์šฉ

๊ธฐ์กด ์†์„ฑ DataGridColumn.CanUserReorder ๋“ฑ๊ณผ ์ผ๊ด€๋˜๊ฒŒ DataGridColumn CanUserChangeVisibility ์†์„ฑ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. DataGridColumn.CanUserChangeVisibility ๊ฐ€ true์ด๋ฉด ์ตœ์ข… ์‚ฌ์šฉ์ž๋Š” DataGridColumn.Visibility ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” GUI ์š”์†Œ ์ง€์›

DataGrid.RowDetailsTemplate ( Windows.UI.Xaml.DataTemplate )๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ํ–‰ ์„ธ๋ถ€ ์ •๋ณด GUI๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ API์— ๋„ฃ์–ด์•ผ ํ•˜์ง€๋งŒ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์•„์ด๋””์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. DataGridRowDetailsEventArgs.DetailsElement ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ธฐ์กด ์ด๋ฒคํŠธ DataGrid.LoadingRow ๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ UIElement๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ƒ์„ฑ(๋˜๋Š” ์—…๋ฐ์ดํŠธ)ํ•˜๊ณ  DetailsElement ์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ DataGrid์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Windows.UI.Xaml.DataTemplate ์˜ ํ•„์ˆ˜ ์‚ฌ์šฉ์ด ๋ฌธ์ œ์ธ ์ด์œ : ํ…œํ”Œ๋ฆฟ์€ ์ข‹์€ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ํ…œํ”Œ๋ฆฟ ๊ฐœ๋…์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋œ XAML ์Šค๋‹ˆํŽซ/๋ฌธ์„œ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ…œํ”Œ๋ฆฟ์€ ์•ฑ์ด ๋Ÿฐํƒ€์ž„์— GUI๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚˜๋Š” DataTemplate ์— ๋Œ€ํ•ด ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€์•ˆ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

ํ–‰์„ ์•ˆ์ชฝ๊ณผ ๋ฐ”๊นฅ์ชฝ์œผ๋กœ ๋Œ์–ด์„œ ๋†“๊ธฐ

ํ–‰์˜ ๋‚˜๊ฐ€๋Š” ๋Œ์–ด์„œ ๋†“๊ธฐ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. DataGrid๋Š” ๋“œ๋ž˜๊ทธ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€๋งŒ ๋“œ๋กญ์€ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋“œ๋กญ์ด ๋ฐœ์ƒํ•˜๋ฉด DataGrid๋Š” ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ณ  ์•ฑ์€ ํ–‰์ด DataGrid ์™ธ๋ถ€์— ๋“œ๋กญ๋  ๋•Œ ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฒคํŠธ์— ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํ–‰ ๋˜๋Š” ํ•ญ๋ชฉ/๊ฐœ์ฒด์˜ ๋“ค์–ด์˜ค๋Š” ๋Œ์–ด์„œ ๋†“๊ธฐ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. DataGrid๋Š” ๋“ค์–ด์˜ค๋Š” ๋Œ์–ด์„œ ๋†“๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๋†“๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. DataGrid๋Š” ํ–‰/ํ•ญ๋ชฉ/๊ฐœ์ฒด๋ฅผ ๋†“์„ ๋•Œ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ณ , DataGrid ๋‚ด๋ถ€์— ํ–‰์„ ๋†“์„ ๋•Œ ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์•ฑ์ด ์ด๋ฒคํŠธ์— ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ณ„ ์„ธํฌ ๋ฐฐ๊ฒฝ

ํŠน์ • ์‹œ๊ฐ„(์˜ˆ: ์•ฑ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋‚˜ ์ค‘์š”ํ•œ ๊ฐ’ ๋˜๋Š” ์•ˆ์ „ ํ•œ๊ณ„๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์œ„ํ—˜ํ•œ ๊ฐ’์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ)์— ๊ฐœ๋ณ„ ์…€์„ ๊ฐ•์กฐํ•˜๊ธฐ(์…€ ๋ฐฐ๊ฒฝ์ƒ‰/๋ธŒ๋Ÿฌ์‹œ ๋ณ€๊ฒฝ)๋ฅผ ์›ํ•˜๋Š” ๊ณ ๊ฐ์˜ ๊ธฐ๋Šฅ ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ DataGridCell.Background ์†์„ฑ( Brush ์œ ํ˜•)์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์ง€๋งŒ DataGrid๊ฐ€ DataGridCell ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•์€ ์•„๋งˆ๋„ ๊ฒฐํ•จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ? ๋”ฐ๋ผ์„œ DataGridCell.Background ์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ ๊ฐœ๋ณ„ ์…€์„ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ์€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์€ ์ด์ „ ๋ฉ”์‹œ์ง€์—์„œ ์ œ์•ˆํ•œ DataGridColumn.DisplayingCell ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” DataGridDisplayingCellEventArgs CellBackgroundBrush ์†์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ค๋‹ค์šด DataGrid์˜ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰(์…€ ๊ฐ’)

"๋ฉ์ฒญํ•œ" ์†Œ๋ฆฌ๊ฐ€ ์•„์ฃผ ๋‚˜์˜๊ฒŒ ๋“ค๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ DataGrid๊ฐ€ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰(DataGrid์—์„œ ํ‘œ์‹œํ•  ์…€ ๊ฐ’ ๊ฒ€์ƒ‰) ์˜์—ญ์—์„œ ๋ฉ์ฒญํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋‹ค๋ฉด ์ •๋ง ์ข‹์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ DataGrid๋Š” DataGrid.ItemsSource ์†์„ฑ๊ณผ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๊ธฐ์ˆ ( DataGridBoundColumn.Binding ์†์„ฑ) ๋ฐ System.ComponentModel.INotifyPropertyChanged ์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํŽธ๋ฆฌํ•œ ์ž๋™ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์€ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ์‚ฌ์‹ค ์ €๋Š” DataGrid๊ฐ€ ๊ทธ ๋ถ€์„œ์—์„œ _less_ ํ•˜๋Š” ๊ฒƒ์„ ํ›จ์”ฌ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค! ์—ฌ๋Ÿฌ Microsoft ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์‹ค์ œ๋กœ ๋˜‘๋˜‘ํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋„ˆ๋ฌด ๋˜‘๋˜‘ํ•ด ์ง€๋Š” ํ–‰๋™์„ ํ†ตํ•ด ๋‚˜์—๊ฒŒ ํฐ ์–ด๋ ค์›€์„ ์ค๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์Šค๋งˆํŠธ/์ž๋™/ํŽธ๋ฆฌํ•œ ์‹œ๋„๋ฅผ ์ค‘๋‹จํ•œ๋‹ค๋ฉด ์‹ค์ œ๋กœ ์–ด๋ ค์›€๊ณผ ์ž‘์—…๋Ÿ‰์ด ์ค„์–ด๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž๋™ ๋™์ž‘์„ ์„ค๊ณ„ํ•  ๋•Œ ์ž๋™์€ ํ›Œ๋ฅญํ•˜๊ฒŒ ๋“ค๋ฆฌ์ง€๋งŒ ์—ญํšจ๊ณผ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

_"์ € ํ˜ผ์ž ํ•˜๊ฒŒ ํ•ด์ฃผ์„ธ์š”."_
๋•Œ๋•Œ๋กœ ๊ฐ€์žฅ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ DataGrid์™€ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด์—์„œ "์ž๋™์œผ๋กœ" ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•˜๋Š” ๋Œ€์‹  ์•ฑ์ด ์Šค์Šค๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. DataGrid๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด DataGridBoundColumn.Binding ๋ฐ DataGrid.ItemsSource ์†์„ฑ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋Œ€์‹  ์Šค์Šค๋กœ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ์™„์ „ํžˆ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ๋Š” DataGrid.ItemsSource ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ญ๋ชฉ์„ ๊ณต๊ธ‰ํ•ด์•ผ ํ•˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. @dotMorten ์€ ๋ฐฑ๋งŒ ๊ฐœ์˜ ํ–‰์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ DataGrid๋Š” ์•ฑ์ด DataGrid.ItemsSource ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฌดํ™”ํ•˜์ง€๋งŒ ๋ฐฑ๋งŒ ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜๋Š” ๋ชฉ๋ก ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋น„ํ˜„์‹ค์ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ DataGrid๊ฐ€ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ๋ถ€์„œ์—์„œ ๋˜‘๋˜‘ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋Œ€์‹  DataGridBoundColumn.Binding ๋ฐ DataGrid.ItemsSource ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ์™„์ „ํžˆ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@anawishnoff ๋Š” ๋‹ค์Œ

์„ฑ๋Šฅ์€ ํ™•์‹คํžˆ ์ด ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š” ๋™๊ธฐ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๊ฐ€์ƒํ™” ์Šคํ† ๋ฆฌ์™€ ItemsRepeater์™€ ๊ฐ™์€ ์ตœ์‹  ์ปจํŠธ๋กค์˜ ์‚ฌ์šฉ์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•˜๋ ค๋Š” ์ฃผ์š” ๊ฐœ์„  ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๊ฐ€์ƒํ™” ์Šคํ† ๋ฆฌ๊ฐ€ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•œ ๊ฒƒ์„ ๋ณด๋‹ˆ ์ข‹์€ ์†Œ์‹์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ DataGrid๊ฐ€ ํ‘œ์‹œํ•˜๋Š” ์…€ ๊ฐ’์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด DataGridBoundColumn.Binding ์†์„ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ๋„ ์—†์•จ๊นŒ์š”?

์ „์ฒด ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ์ž‘์—…์ด DataGrid๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•ฑ์— ์•„์›ƒ์†Œ์‹ฑ ๋˜๋Š” ๊ฒฝ์šฐ ์•ฑ์€ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์™„์ „ํ•œ ์œ ์—ฐ์„ฑ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ @dotMorten์ด ์–ธ๊ธ‰ํ•œ ๋ฐฑ๋งŒ ๊ฐœ์˜ ํ–‰์„ ํฌํ•จํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ค๋คํ•˜๊ฒŒ, ์ œ๋ฐœ :์Šค๋งˆ์ผ:

WPF DataGrid์— ๋ช‡ ๊ฐ€์ง€ ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

WPF ๋ฒ„์ „์˜ DataGrid์—๋Š” ๋ถˆํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋น„์‹ค์šฉ์ ์ธ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ WinUI DataGrid์—์„œ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์˜๊ฒฌ์„ ๊ฐ€์งˆ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

WinUI DataGrid๊ฐ€ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ DataGrid ๋‚ด๋ถ€์—์„œ ์ธ๋ผ์ธ/์ง์ ‘์ ์œผ๋กœ ์…€ ๊ฐ’์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ํฌ๊ธฐํ•œ๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด์˜๋ฅผ ์ œ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ DataGrid๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ์ธ๋ผ์ธ/์ง์ ‘ ํŽธ์ง‘ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ DataGrid.IsReadOnly ๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ„๋„์˜ ์ฐฝ์ด๋‚˜ ํŒจ๋„ ๋˜๋Š” RowDetails( DataGrid.RowDetailsTemplate )์—์„œ ์„ ํƒํ•œ ํ–‰์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ DataGrid ์ž์ฒด ๋‚ด๋ถ€์—์„œ๋Š” ์ง์ ‘ ํŽธ์ง‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

WPF DataGrid์— CanUserAddRows ๋ฐ CanUserDeleteRows ์žˆ์—ˆ์ง€๋งŒ WinUI DataGrid์—๋Š” ์ด๋Ÿฌํ•œ ์†์„ฑ์ด ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— WinUI DataGrid๊ฐ€ ์ด๋ฏธ ์ธ๋ผ์ธ/์ง์ ‘ ํŽธ์ง‘ ์ง€์›์„ ์ค‘๋‹จํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ธ๋ผ์ธ/์ง์ ‘ ํŽธ์ง‘ ๊ธฐ๋Šฅ์„ ์™„์ „ํžˆ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด ์•„์ด๋””์–ด์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๊นŒ?

๊ฐœ๋ณ„ ์…€ ์„ ํƒ: WPF DataGrid์—๋Š” Cell , FullRow ๋˜๋Š” CellOrRowHeader ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” SelectionUnit ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ํ•ญ์ƒ FullRow ๋กœ ์„ค์ •ํ•˜๊ณ  Cell ๋กœ ์„ค์ •ํ•  ํ•„์š”๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ ํ•œ ์‚ฌ๋žŒ์ด ์ด๋ฏธ ๋‹จ์ผ ์…€ ์„ ํƒ ๋ชจ๋“œ๋ฅผ ์š”์ฒญํ•œ ๊ฒƒ์„ ๋ด…๋‹ˆ๋‹ค. ์ œ ์งˆ๋ฌธ์€ ์…€ ์„ ํƒ ๋ชจ๋“œ๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์š”์ฒญ์ธ์ง€ ๋˜๋Š” ๋“œ๋ฌธ ์š”์ฒญ์ธ์ง€์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ๊ฐœ๋ณ„ ์…€ ์„ ํƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ํ–‰/์…€์„ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌํ•  ๋•Œ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ์ „์ฒด ํ–‰์„ ๋ณต์‚ฌํ•˜๋Š” ๋Œ€์‹  ๊ฐœ๋ณ„ ์…€(๋˜๋Š” ์—ฌ๋Ÿฌ ์ธ์ ‘ ์…€)์„ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ธฐ๋Šฅ์ด ์ •๋ง ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

| WPF์˜ ๋ชจํ˜ธํ•œ ๊ธฐ๋Šฅ | ๋Œ“๊ธ€ |
| :--- | :--- |
| DataGrid.IsReadOnly | IsReadOnly๋ฅผ false๋กœ ์„ค์ •ํ•  ํ•„์š”๊ฐ€ ์—†์„๊นŒ์š”? |
| DataGrid.CanUserAddRows | WinUI DataGrid์— ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ํฌ๊ธฐํ–ˆ๊ฑฐ๋‚˜ ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(๊ณ„ํš์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค). |
| DataGrid.CanUserDeleteRows | WinUI DataGrid์— ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ํฌ๊ธฐํ–ˆ๊ฑฐ๋‚˜ ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(๊ณ„ํš์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค). |
| DataGrid.SelectionUnit | WinUI DataGrid์— ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. |

์™€์šฐ, ์—ฌ๊ธฐ์— ๋†€๋ผ์šด ํ† ๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค. โค๏ธ

๋˜ํ•œ WPF DataGrid API์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. WPF DataGrid๋Š” ์‹ค์ œ๋กœ ๋‚ด๊ฐ€ WinUI 3.0์— ์›ํ•˜๋Š” DataGrid์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ WPF DataGrid์—๋„ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ณ ๊ฐ์ด ๋” ๊ฐ•๋ ฅํ•œ ํƒ€์‚ฌ DataGrid๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์—ด ํ—ค๋”์˜ ํ•„ํ„ฐ
  • DataGrid ์ƒ๋‹จ์˜ ์™„์ „ํ•œ ํ•„ํ„ฐ ํ–‰
  • ๊ณ„์ธต์  ๋ฐ์ดํ„ฐ์˜ ๊ฐ•๋ ฅํ•œ ํ‘œ์‹œ. ์ผ๋ถ€ ํƒ€์‚ฌ DataGrid๋Š” ์‹ค์ œ๋กœ ์ค‘์ฒฉ DataGrid๊ฐ€ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ TreeView์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. WPF DataGrid๋Š” ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด DateTime ์—ด๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. WPF์˜ DataGrid์—์„œ๋Š” DataGridTemplateColumn์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“ , ๋ฌด์—‡์„ ํ•˜๋“ ์ง€ DataGrid๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์€ WinUI 3.0์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์„ ์–ธ์ด์ž ์•ฝ์†์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. LOB ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ๋‚ด์žฅ DataGrid๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ UI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ง„์ง€ํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  WinUI๋ฅผ ์œ„ํ•œ ์ด๋Ÿฌํ•œ ํˆฌ์ž๋ฅผ ๋ณด๋‹ˆ ์ •๋ง ์ข‹์Šต๋‹ˆ๋‹ค!

@thomasclaudiushuber

LOB ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ๋‚ด์žฅ DataGrid๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ UI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ง„์ง€ํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  WinUI๋ฅผ ์œ„ํ•œ ์ด๋Ÿฌํ•œ ํˆฌ์ž๋ฅผ ๋ณด๋‹ˆ ์ •๋ง ์ข‹์Šต๋‹ˆ๋‹ค!

๋™์˜! ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ DataGrid๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์—†์ด๋Š” ์‚ด ์ˆ˜ ์—†๋Š” ๋งค์šฐ ํ•„์ˆ˜์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

๊ณ„์ธต์  ๋ฐ์ดํ„ฐ์˜ ๊ฐ•๋ ฅํ•œ ํ‘œ์‹œ. ์ผ๋ถ€ ํƒ€์‚ฌ DataGrid๋Š” ์‹ค์ œ๋กœ ์ค‘์ฒฉ DataGrid๊ฐ€ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ TreeView์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ ์ฃผ์ œ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด -- ๋‹น์‹ ์ฒ˜๋Ÿผ -- ์ €๋Š” ๊ณ„์ธต์  DataGrid๊ฐ€ ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋Š” ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์ง€๋งŒ ์ œ ๊ฑฑ์ •์€ DataGrid๊ฐ€ ๊ณ„์ธต์  ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. DataGrid๋Š” ์ƒ๋‹นํžˆ ์ง€์—ฐ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๊ณ„์ธต์  ๊ธฐ๋Šฅ๊ณผ ๋น„๊ณ„์ธต์  ๊ธฐ๋Šฅ ๋ชจ๋‘์™€ ํ˜ธํ™˜๋˜๋Š” ์ƒˆ ๊ธฐ๋Šฅ์„ ๋งŒ๋“œ๋Š” ๋ณต์žก์„ฑ ๋•Œ๋ฌธ์— ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ณต์žก์„ฑ/์ง€์—ฐ ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ ์†”๋ฃจ์…˜์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. DataGrid ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ/๋ž˜ํ•‘ํ•˜๋Š” HierarchicalDataGrid ๋ผ๋Š” ๋ณ„๋„์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋˜๋Š” HierarchicalDataGrid ๊ฐ€ ๊ณต๊ฐœ์ ์œผ๋กœ DataGrid ์ƒ์†ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ์ƒ์†์ด ๋น„์‹ค์šฉ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ HierarchicalDataGrid Control ์ƒ์†ํ•˜๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ DataGrid ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณ„์ธต์  ๊ธฐ๋Šฅ์€ ๋‚ด๋ถ€ ๋น„๊ณ„์ธต์  DataGrid ์ธ์Šคํ„ด์Šค๋ฅผ ์ง€์‹œํ•˜๋Š” HierarchicalDataGrid ๊ณ„์ธต์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

์œ„ ์†”๋ฃจ์…˜์˜ ์ฃผ์š” ์ด์ ์€ DataGrid DataGrid ๋„ˆ๋ฌด ๋ณต์žกํ•ด์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†๊ณ  ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋Š๋ ค์ง€๋Š” ์ผ ์—†์ด DataGrid _์—†๋Š”_ ์›ํ•˜๋Š” ๊ณ„์ธต์  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด DateTime ์—ด๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋™์˜ํ•œ๋‹ค. ์ด์ „ ๋ฉ”์‹œ์ง€์—์„œ ์ œ์•ˆํ•œ DataGridDateTimeColumn ๋ฐ DataGridTimeSpanColumn ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

@ํ”ผ๋…น์Šค

์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ์‰ฝ๊ฒŒ ํ•„ํ„ฐ๋ง

@thomasclaudiushuber

์—ด ํ—ค๋”์˜ ํ•„ํ„ฐ DataGrid ์ƒ๋‹จ์˜ ์™„์ „ํ•œ ํ•„ํ„ฐ ํ–‰.

ํ•„ํ„ฐ๋Š” ์›ํ•˜๋Š” ๊ฒƒ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์ˆ˜์˜ ํ–‰์„ ์ˆ˜๋™์œผ๋กœ ์‚ดํŽด๋ณด์•„์•ผ ํ•˜๋Š” ํ˜„์žฌ ์ƒํ™ฉ ๋Œ€์‹  ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ํ–‰ ๋˜๋Š” ํ–‰์„ ๋น ๋ฅด๊ฒŒ ์ฐพ๋Š” ๋ฐ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž์˜ ํ•„ํ„ฐ ํ…์ŠคํŠธ๋ฅผ ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ์—ด๊ณผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฌธ์ œ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? DataGridTemplateColumn ๋“ฑ์œผ๋กœ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด DataGridTextColumn ์ด์™ธ์˜ ์—ด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? DataGridColumn (๋ฐ ํ•˜์œ„ ํด๋ž˜์Šค)์— ์…€ ๊ฐ’์„ ๊ฒ€์ƒ‰/ํ•„ํ„ฐ๋ง/๋งค์นญ์— ์‚ฌ์šฉํ•  ํ‚ค์›Œ๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋‹ค์Œ ์†”๋ฃจ์…˜๊ณผ ๋น„์Šทํ•œ ๊ฒƒ์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

public delegate void DataGridCellValueToKeywordsConverter(object cellValue, ICollection<string> outputKeywords);

public class DataGridColumn
{
    ...
    public DataGridCellValueToKeywordsConverter CellValueToKeywordsConverter { get; set; }

    /// <param name="cellValue">The input/source value of the cell, to be converted to keywords.</param>
    /// <param name="outputKeywords">A collection that the method will add the keywords to.  The method invokes ICollection.Add for each keyword.</param>
    public virtual void ConvertCellValueToKeywords(object cellValue, ICollection<string> outputKeywords)
    {
        // Subclasses can override this method.  The default behavior is to invoke the delegate to do the job.
        DataGridCellValueToKeywordsConverter d = this.CellValueToKeywordsConverter;
        if (!(d is null)) d(cellValue, outputKeywords);
    }
}

๋‹ค์Œ์€ ConvertCellValueToKeywords ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

void TestKeywords(DataGridColumn column)
{
    var keywords = new System.Collections.Generic.HashSet<string>();
    foreach (object cellValue in someCellValueList)
    {
        keywords.Clear();
        column.ConvertCellValueToKeywords(cellValue, keywords);
        CheckIfFilterTextMatchesAnyKeyword(keywords);
    }
}

๋˜๋Š” ์…€ ๊ฐ’์„ ํ‚ค์›Œ๋“œ ๋ชจ์Œ์ด ์•„๋‹Œ ๋‹จ์ผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ‚ค์›Œ๋“œ ๋ชจ์Œ์„ ์ œ์•ˆํ•œ ์ด์œ ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ–‰์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„๋„ ๊ณ ์†์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ํฐ.

์—‘์…€์—์„œ ๊ณผ๊ฑฐ ๋ณต์‚ฌํ•˜๊ธฐ
์ด์ œ ctrl+v๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Excel ์…€ ๋‚ด์šฉ์„ DataGrid์— ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋“  ์…€ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ์˜ ํ•œ ์…€์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒํ•œ ํ–‰์„ ๊ด€๋ฆฌํ•  ๋•Œ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก SelectedItems๋ฅผ ์ข…์†์„ฑ ์†์„ฑ์œผ๋กœ ๋งŒ๋“ค์–ด ์ ์ ˆํ•œ ๋‹ค์ค‘ ์„ ํƒ ํ•ญ๋ชฉ ์ง€์›์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

@verelpode ๊ฐœ๋ณ„ ์…€ ์„ ํƒ์ด ๋ชจ๋“  ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ์œ ํ˜• ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์œ ์šฉ

@anawishnoff ์ €๋Š” @Laz3rPanth3r ์ด ๋™์˜ํ•  ๊ฒƒ์ด๋ฉฐ DataGrid๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๋ผ๋Š” ํˆดํ‚ท์˜ ์—ฌ๊ธฐ ์ €๊ธฐ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์— ๋™์˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชฉ๋ก์˜ ๊ฐœ์ฒด ๋˜๋Š” ํ™•์žฅ ๊ฐœ์ฒด ์ปฌ๋ ‰์…˜์— ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ๊ทธ๋ฆฌ๋“œ๋ฅผ ๋ถ€ํŠธ์ŠคํŠธ๋žฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž์™€ ๋ฌธ์ž์—ด, ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋Œ€ํ•œ ์—ด์„ ์ง€๋Šฅ์ ์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ ์ด์ƒ์œผ๋กœ ๊ฐœ๋ณ„ ์—ด์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ณ„ ์…€ ์„ ํƒ์ด ๋ชจ๋“  ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ์œ ํ˜• ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์Šคํ”„๋ ˆ๋“œ ์‹œํŠธ, ์—ด ํ—ค๋” ์•ŒํŒŒ๋ฒณ ์˜ค๋ฆ„์ฐจ์ˆœ ๋ฌธ์ž๋กœ ๋ช…๋ช… ๋œ, A, B, C, D ... ๋ชจ๋“  ํ•ญ๋ชฉ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋กœ์„œ ๊ฐ ์ปฌ๋Ÿผ์˜ ์œ ํ˜•์€ ๋™์ผ DataGridTextColumn ์™€ ๋‹ค๋ฅธ ์—ด์˜ ์œ ํ˜•์ด ํ•„์š”ํ•˜๊ณ  ์—ด ์ด๋ฆ„์€ ์•ŒํŒŒ๋ฒณ์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
DataGrid์™€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์˜ ๋˜ ๋‹ค๋ฅธ ์ฐจ์ด์ ์€ ์—ด ๋จธ๋ฆฌ๊ธ€์„ ํด๋ฆญํ•  ๋•Œ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๊ฐ€ ํ–‰์„ ์ •๋ ฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์š”์ ์€ DataGrid์™€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ์‚ฌ์ด์— ํ”ผ์ƒ์ ์ธ ์œ ์‚ฌ์„ฑ(๋Œ€๋ถ€๋ถ„ ์‹œ๊ฐ์  ์œ ์‚ฌ์„ฑ)๋งŒ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. DataGrid๋Š” ์‹ค์ œ๋กœ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. DataGrid์˜ ์…€ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ๊ธฐ์ˆ ์€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์—๋„ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

DataGrid๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋Š” DataGrid๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์„ ํƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

DataGrid์˜ ๊ธฐ์กด ๋””์ž์ธ์€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ณด๋‹ค SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ›จ์”ฌ ๋” ์ž˜ ๋งž์œผ๋ฉฐ, ๋ˆ„๊ตฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ "๊ทธ๋ƒฅ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ"๋ผ๊ณ  ์ฃผ์žฅํ•˜๋ ค๊ณ  ํ•˜๋ฉด SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ๋ฐœ์ž๋Š” ํฐ ์†Œ๋ฆฌ๋กœ ์™ธ์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@verelpode ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ๋Š” ๋งค์šฐ ์ƒ์„ธํ•˜๊ณ 

ํ˜„์žฌ DataGrid๋Š” ์•ฑ์ด DataGrid.ItemsSource๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฌดํ™”ํ•˜์ง€๋งŒ ๋ฐฑ๋งŒ ๊ฐœ์˜ ํ•ญ๋ชฉ์ด ํฌํ•จ๋œ ๋ชฉ๋ก ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋น„ํ˜„์‹ค์ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ DataGrid๊ฐ€ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ๋ถ€์„œ์—์„œ ๋˜‘๋˜‘ํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ฉˆ์ถ”๊ณ  ๋Œ€์‹  DataGridBoundColumn.Binding ๋ฐ DataGrid.ItemsSource๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์Šค์Šค๋กœ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ์™„์ „ํžˆ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํฅ๋ฏธ๋กญ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์„ฑ๋Šฅ์— ์ •๋ง๋กœ ๊ด€์‹ฌ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ ์ƒํ™ฉ/์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? DataGrid๋ฅผ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ํ•ด๋‹น ๋ผ์ธ์— ๋”ฐ๋ผ ๋ฐ”๋กœ ์—ฐ๊ฒฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@khoshroomahdi ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ๊ธฐ๋Š” ์‹คํ–‰์ค‘์ธ ์•ฑ์˜ DataGrid์— Excel ์…€์„ ๋ณต์‚ฌํ•˜๊ณ  ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ฑ„์šฐ๋ ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ํฅ๋ฏธ๋กœ์šด ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ๋” ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@alexyak , ์กฐ๊ธˆ ๋” ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? SelectedItems ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ DataGrid์—์„œ ์„ ํƒํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ •ํ™•ํžˆ ๋‹ค์ค‘ ์„ ํƒ ๋ชจ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ™•์žฅ ์„ ํƒ ๋ชจ๋“œ๋ฅผ ํ†ตํ•ด). DataGrid ๋‚ด์—์„œ ์„ ํƒํ•˜๋ ค๋ฉด ํ™•์‹คํžˆ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€๋งŒ ๊ท€ํ•˜์˜ ์š”์ฒญ์„ ๋” ์ž˜ ์ดํ•ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@anawishnoff ๋„ค ๋งž์Šต๋‹ˆ๋‹ค.
Excel ์…€์— ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๊ณ  ์‹คํ–‰ ์ค‘์ธ ์•ฑ์—์„œ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๊ฒฝ์šฐ ๋ช‡ ๋…„ ์ „์— ์ž‘์„ฑํ•œ WinForms DataGridView ์ปจํŠธ๋กค์ด ๊ฐ€์ƒ ๋ชจ๋“œ( https://docs.microsoft.com/en-us/dotnet/api/system)๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

ํ˜„์žฌ DataGrid๋Š” ์•ฑ์ด DataGrid.ItemsSource๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฌดํ™”ํ•˜์ง€๋งŒ ๋ฐฑ๋งŒ ๊ฐœ์˜ ํ•ญ๋ชฉ์ด ํฌํ•จ๋œ ๋ชฉ๋ก ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋น„ํ˜„์‹ค์ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ DataGrid๊ฐ€ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ๋ถ€์„œ์—์„œ ๋˜‘๋˜‘ํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ฉˆ์ถ”๊ณ  ๋Œ€์‹  DataGridBoundColumn.Binding ๋ฐ DataGrid.ItemsSource๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์Šค์Šค๋กœ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ์™„์ „ํžˆ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ItemsSource๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ListBox์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ณผ๊ฑฐ์—๋Š” ํŽ˜์ด์ง•์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ถ€๋ถ„ ๋ณด๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒˆ DataTable์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค(์ด๊ฒƒ์ด ์ข‹์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž„). ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น DataTable์˜ ๋ณด๊ธฐ๋ฅผ ItemsSource๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ณ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ํ•„์ˆ˜์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹คํžˆ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ปจํŠธ๋กค์„ Excel(r)์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ชจ๋“  ์ฃผ์„๊ณผ ๊ด€๋ จํ•˜์—ฌ DataGrid๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์…€ ์„ ํƒ ๋ฐ ์…€๋ณ„ ํŽธ์ง‘์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ์™ธ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ ๋“ฑ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@alexyak SelectedItems๋ฅผ ์‹ค์ œ ๋ฐ”์ธ๋”ฉ ๊ฐ€๋Šฅํ•œ DependencyProperty๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์š”์ฒญ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด๊ฒƒ์€ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๋Š” ๋ฐ๋„ ์ข‹์Šต๋‹ˆ๋‹ค(์ง€๊ธˆ๊นŒ์ง€ ๋‚ด ๊ธฐ๋Šฅ ์š”์ฒญ์˜ ๋Œ€๋ถ€๋ถ„์€ ๋ณด๊ธฐ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๋‚ด๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” WinUI/UWP ์ปจํŠธ๋กค์—์„œ ์ง€์›๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ํ”„๋ ˆ์ž„์›Œํฌ ์ „์ฒด์˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ ์š”์ฒญ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ† ๋ก  ๋ณด๊ธฐ

@anawishnoff ๋Š” ๋‹ค์Œ

๊ท€ํ•˜์˜ ๊ธฐ์—ฌ๋Š” ๋งค์šฐ ์ƒ์„ธํ•˜๊ณ  ์‚ฌ๋ ค๊นŠ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ธฐ์—ฌ๊ฐ€ DataGrid๋ฅผ ๋”์šฑ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค๋Š” ์†Œ์‹์„ ๋“ค์œผ๋‹ˆ ๊ธฐ์ฉ๋‹ˆ๋‹ค. :)

๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ ์ƒํ™ฉ/์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? DataGrid๋ฅผ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ํ•ด๋‹น ๋ผ์ธ์— ๋”ฐ๋ผ ๋ฐ”๋กœ ์—ฐ๊ฒฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์—ฌ์ „ํžˆ ๋„ˆ๋ฌด ๋˜‘๋˜‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋งˆํŠธํ•œ ๋™์ž‘์€ ๋‹ค๋ฅธ ์•ฑ์ด ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ๋งˆ๋‹ค ํ™˜๊ฒฝ์ด ๋งค์šฐ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— "์ตœ์ƒ์˜" ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์€ ์•ฑ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‹จ์ผ "์ตœ๊ณ "๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ถ€ ์•ฑ์€ 200๊ฐœ ์ด์ƒ์˜ ํ–‰์„ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š” ๋ฐ˜๋ฉด, ์ผ๋ถ€ ๋‹ค๋ฅธ ์•ฑ์€ ์–ธ๊ธ‰๋œ @dotMorten ๊ณผ ๊ฐ™์€ ๋ฐฑ๋งŒ ๊ฐœ์˜ ํ–‰์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•˜๋‚˜์˜ ์‹ ๋ฐœ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ •๋ง๋กœ ๊ทธ๊ฒƒ์„ ์ด ์ˆ˜์ค€์œผ๋กœ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  1. DataGrid๋Š” ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์ €์žฅ ์‹œ์Šคํ…œ์—์„œ 9001ํ–‰์˜ 5์—ด์— ์žˆ๋Š” ๊ฐ’์„ ํ‘œ์‹œ(๋˜๋Š” ์‚ฌ์šฉ)ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. DataGrid๋Š” 9001ํ–‰์˜ 5์—ด์— ๋Œ€ํ•œ ๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์•ฑ์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
  3. ์•ฑ์€ 9001ํ–‰์˜ 5์—ด์— ๋Œ€ํ•œ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋น„๋™๊ธฐ SQL ์ฟผ๋ฆฌ, ๋น„๋™๊ธฐ C# ์ž‘์—… ๋˜๋Š” ๊ธฐํƒ€ ๋ฐ์ดํ„ฐ ์‹œ์Šคํ…œ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ DataGrid๋Š” ์ด ๋‹จ๊ณ„๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  4. ์•ฑ์€ 9001ํ–‰์˜ 5์—ด์— ๋Œ€ํ•œ ๊ฐ’ ๊ฒ€์ƒ‰์„ ์™„๋ฃŒํ–ˆ์Œ์„ DataGrid์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ์•ฑ์€ ์ด ๊ฐ’์„ DataGrid์— ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  5. DataGrid๋Š” 1๋‹จ๊ณ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฐ’์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ํ•„์š”ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@RBrid ๋Š” ๋‹ค์Œ

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๊ฒฝ์šฐ ๋ช‡ ๋…„ ์ „์— ์ž‘์„ฑํ•œ WinForms DataGridView ์ปจํŠธ๋กค์ด ๊ฐ€์ƒ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„ค ๋„ค ๋„ค! ๋‚˜๋Š” WinForms DataGridView๋ฅผ ์‚ฌ์šฉํ•œ ์ ์ด ์—†์ง€๋งŒ ์ง€๊ธˆ ๋ง‰ ๋ฌธ์„œ๋ฅผ ์ฝ์—ˆ๊ณ  ๋‹น์‹ ์ด ๋จธ๋ฆฌ์— ๋ชป์„ ๋ฐ•์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งํฌ ํ•œ
_"๊ฐ€์ƒ ๋ชจ๋“œ๋Š” ๋งค์šฐ ํฐ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค."_

WinForms DataGridViewCellValueEventArgs ์—๋Š” ๋‹ค์Œ ์†์„ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

public int RowIndex { get; }      // DataGrid sets RowIndex.
public int ColumnIndex { get; }   // DataGrid sets ColumnIndex.
public object Value { get; set; } // The app sets Value.

์ด์ƒ์ ์œผ๋กœ๋Š” ์ตœ์‹  C# async ๋ฐ await ํ‚ค์›Œ๋“œ ๋˜๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” UWP( IAsyncOperation<TResult> ) ๋˜๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์‹œ๊ฐ„ ์ง€์—ฐ์„ ์ง€์›ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ์…€ ๊ฐ’์„ ์š”์ฒญํ•˜๋Š” DataGrid์™€ ์…€ ๊ฐ’์„ DataGrid์— ์ „๋‹ฌํ•˜๋Š” ์•ฑ ์‚ฌ์ด. ๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ๋ฅผ ์ง€์›ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  1. ์ด๋ฒคํŠธ CellValueNeeded๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  2. DataGridViewCellValueEventArgs.Value ์†์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  3. DataGridViewCellValueEventArgs.Value ์†์„ฑ์„ ์ฆ‰์‹œ/๋™๊ธฐ์ ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๋Œ€์‹  ์•ฑ์ด ํ˜ธ์ถœํ•  SupplyCellValue ์™€ ๊ฐ™์€ ์ด๋ฆ„์˜ DataGrid ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

SupplyCellValue ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class DataGrid
{
    public void SupplyCellValue(int rowIndex, int columnIndex, object value);
    // Alternatively:
    public void SupplyCellValue(int rowIndex, DataGridColumn column, object value);
}

๋”ฐ๋ผ์„œ ๋Ÿฐํƒ€์ž„ ์‹œ ์ ˆ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. DataGrid๋Š” ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์ €์žฅ ์‹œ์Šคํ…œ์—์„œ 9001ํ–‰์˜ 5์—ด์— ์žˆ๋Š” ๊ฐ’์„ ํ‘œ์‹œ(๋˜๋Š” ์‚ฌ์šฉ)ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. DataGrid๋Š” CellValueNeeded ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ณ  DataGridViewCellValueEventArgs.RowIndex ๋ฅผ 9001๋กœ, DataGridViewCellValueEventArgs.ColumnIndex ๋ฅผ 5๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ(์•ฑ)๋Š” 9001ํ–‰์˜ 5์—ด์— ๋Œ€ํ•œ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋น„๋™๊ธฐ ์ž‘์—… ์‹คํ–‰์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋น„๋™๊ธฐ ์ž‘์—… ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด ์•ฑ์ด ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•œ ๊ฒฝ์šฐ ์•ฑ์ด DataGrid.SupplyCellValue ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฉ์ฒญํ•œ ๊ธฐ์ˆ ์€ DataGridBoundColumn.Binding ๋ฐ DataGrid.ItemsSource ์˜ ์Šค๋งˆํŠธ ์ž๋™ํ™” ๊ธฐ์ˆ ๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค.

@alexyak , ์กฐ๊ธˆ ๋” ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? SelectedItems ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ DataGrid์—์„œ ์„ ํƒํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ •ํ™•ํžˆ ๋‹ค์ค‘ ์„ ํƒ ๋ชจ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ™•์žฅ ์„ ํƒ ๋ชจ๋“œ๋ฅผ ํ†ตํ•ด). DataGrid ๋‚ด์—์„œ ์„ ํƒํ•˜๋ ค๋ฉด ํ™•์‹คํžˆ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€๋งŒ ๊ท€ํ•˜์˜ ์š”์ฒญ์„ ๋” ์ž˜ ์ดํ•ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‹ค์ค‘ ์„ ํƒ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ทฐ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@verelpode , ์šฐ๋ฆฌ๋Š” ๋” ์˜ค๋ž˜๋œ Win32 ComCtl32 ์ปจํŠธ๋กค์„ ๋”ฐ๋ผ WinForms DataGridView ๋ชจ๋ธ์„ ๋ชจ๋ธ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ชฉ๋ก ๋ณด๊ธฐ ์ปจํŠธ๋กค์ด ๊ฐ€์ƒ ๋ชจ๋“œ์—์„œ LVN_GETDISPINFO ๋ฉ”์‹œ์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(https://docs.microsoft.com/en-us/windows/win32/controls/list-view-controls-overview ์ฐธ์กฐ). #handling-virtual-list-view-control-notification-codes ๋ฐ https://docs.microsoft.com/en-us/windows/win32/controls/lvn-getdispinfo). 90๋…„๋Œ€ ์˜›๋‚  ๋ฌผ๊ฑด๋“ค.

์–ด์จŒ๋“  ๋น„๋™๊ธฐ์‹ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ์ธก๋ฉด์ด ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐฉ์‹์€ '์ง€์—ฐ๋œ ์ด๋ฒคํŠธ'๋ฅผ ํ†ตํ•ด์„œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
WinUI ์ปจํŠธ๋กค์€ ์ด๋ฏธ ์ง€์—ฐ๋œ ์ด๋ฒคํŠธ๋ฅผ ๋‘ ๋ฒˆ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

runtimeclass RefreshRequestedEventArgs
{
    Windows.Foundation.Deferral GetDeferral();
}

runtimeclass TeachingTipClosingEventArgs
{
    TeachingTipCloseReason Reason{ get; };
    Boolean Cancel;
    Windows.Foundation.Deferral GetDeferral();
}

์ƒˆ๋กœ์šด DataGrid์˜ CellValueNeeded ์ด๋ฒคํŠธ๊ฐ€ ์ฑ„ํƒํ•˜๋ ค๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ณ  ์™„๋ฃŒ๋˜๋ฉด ์ปจํŠธ๋กค์— ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://docs.microsoft.com/en-us/uwp/api/windows.foundation.deferral์„ ์ฐธ์กฐ

@RBrid
GetDeferral() ๊ฐ€ ์ƒˆ๋กœ์šด ํ‘œ์ค€ ํŒจํ„ด์ด๋ผ๋Š” ์ ์€ ์ข‹์€ ์ ์ž…๋‹ˆ๋‹ค. CellValueNeeded ์˜ ์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค๋ฅธ ๊ฒฝ์šฐ/์ด๋ฒคํŠธ๋ณด๋‹ค Deferral ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์–ด๋ ค์›Œ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•ด ์ฃผ์„ธ์š”. ํ•˜์ง€๋งŒ ์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์— GetDeferral() ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋ฌธ์ œ๋Š” GetDeferral() ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž ์žฌ์ ์œผ๋กœ ๋งŽ์€ ์ˆ˜์˜ ํ–‰์— ์žˆ๋Š” ๋ชจ๋“  ํ–‰์˜ ๋ชจ๋“  โ€‹โ€‹์…€์— ๋Œ€ํ•ด ์—„์ฒญ๋‚œ ์–‘์˜ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์ •๋ฆฌ๊ฐ€ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ GetDeferral() ๊ตฌํ˜„์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณธ ์ ์ด ์—†์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ์˜คํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•ด Deferral ๊ฐ€ ์žฌํ™œ์šฉ์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜ GetDeferral() ํ›จ์”ฌ ๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋ฉด ์—ฌ์ „ํžˆ ๋„ˆ๋ฌด ๋˜‘๋˜‘ํ•ฉ๋‹ˆ๋‹ค. SupplyCellValue ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ ๋‚ด ์ œ์•ˆ์€ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ–‰์˜ ๋ชจ๋“  โ€‹โ€‹์…€์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด Deferral ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ, ์™„๋ฃŒ ๋ฐ ํ๊ธฐํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  1. GetDeferral()
  2. ์—ฐ๊ธฐ.์™„๋ฃŒ
  3. ์—ฐ๊ธฐ.์ฒ˜๋ถ„
  4. ์œ„์˜ ๋‹จ๊ณ„๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•˜์‹ญ์‹œ์˜ค.

์…€ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ž‘์—…์€ ์•ฑ์— ์•„์›ƒ์†Œ์‹ฑํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์ž‘์—…์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ •๋ ฌ์„ ์•„์›ƒ์†Œ์‹ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹จ์ผ ์ด๋ฒคํŠธ CellValueNeeded ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค ๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์•ฑ์€ ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐœ์ฒด ํ˜•ํƒœ๋กœ DataGrid์— ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. DataGrid๋Š” ์…€ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋งŒ ์ž ์žฌ์ ์œผ๋กœ ์ •๋ ฌ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@dotMorten์ด ์–ธ๊ธ‰ํ•œ ๋ฐฑ๋งŒ ๊ฐœ์˜ ํ–‰์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด CellValueNeeded ๋งŒ์œผ๋กœ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์—ด ํ—ค๋”๋ฅผ ํด๋ฆญํ•˜๊ณ  DataGrid๊ฐ€ ๋ฐฑ๋งŒ ๊ฐœ์˜ ํ–‰์„ ์ •๋ ฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์…€ ๊ฒ€์ƒ‰ ๋ฐ ์ •๋ ฌ์€ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“ˆ/์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์•ฑ์— ์•„์›ƒ์†Œ์‹ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ฑ์ด DataGrid์— ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ชจ๋“ˆ/๊ฐœ์ฒด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ด์ƒ์ ์œผ๋กœ DataGrid๋Š” ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ DataGrid์˜ ๊ธฐ์กด ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์ฝ”๋“œ๋Š” ๋ชจ๋‘ DataGrid์—์„œ ๋ณ„๋„์˜ ์ƒˆ ํด๋ž˜์Šค๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค. DataGridBoundColumn.Binding ๋“ฑ์œผ๋กœ ์ž‘์—…ํ•˜์—ฌ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ชจ๋“ˆ์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์ •๋ ฌ์ด ์•ฑ ๋˜๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ชจ๋“ˆ์—๋„ ์•„์›ƒ์†Œ์‹ฑ๋˜๋Š” ๊ฒฝ์šฐ ์‹œ๋„ํ•˜๋Š” ๋Œ€์‹  SQL ์„œ๋ฒ„์— ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ง€์‹œํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ฐฑ๋งŒ ํ–‰์„ ์ง€์›ํ•˜๋Š” ๋‹ค์–‘ํ•œ ์†”๋ฃจ์…˜์˜ ๋ฌธ์„ ์—ฝ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ •๋ ฌ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์—ด ๋จธ๋ฆฌ๊ธ€์„ ํด๋ฆญํ•œ ํ›„ 10์‹œ๊ฐ„ ๋˜๋Š” 20์‹œ๊ฐ„ ์ด๋‚ด์— DataGrid ๋‚ด๋ถ€์˜ ๋ฐฑ๋งŒ ํ–‰ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

@verelpode , ๋„ค, ๊ทธ๊ฒƒ์€ ์œ ํšจํ•œ ์šฐ๋ ค์ž…๋‹ˆ๋‹ค. DataGrid๊ฐ€ ์žฌํ™œ์šฉ ๊ฐ€๋Šฅํ•œ Windows.Foundation.Deferral ๊ฐœ์ฒด ํ’€์„ ์†Œ์œ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํƒ€๋‹น์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ํ™•์‹คํžˆ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Row Details๊ฐ€ ๊ธฐ๋Šฅ์œผ๋กœ ํฌํ•จ๋œ Windows Community Toolkit DataGrid์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ๊ฐ€์ ธ์™”๊ธฐ ๋•Œ๋ฌธ์—(์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์ง€๋งŒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ) ์ด ์ƒˆ๋กœ์šด DataGrid์— ๋™์ผํ•œ ์˜ต์…˜์„ ํฌํ•จํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ํฌํ•จ๋˜๊ธฐ๋ฅผ ์ •๋ง๋กœ ์›ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ–‰ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋™์‹œ์— ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํŽ˜์ด์ง• GUI์— ๋น„ํ•ด ๋ฐฑ๋งŒ ๊ฐœ์˜ ํ–‰์— ๋Œ€ํ•ด @roblo ๋Š” ๋‹ค์Œ๊ณผ

[๋ฐฑ๋งŒ ํ–‰ ์ง€์›]๋„ ์ข‹์„ ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. .... ์ฆ‰, ๊ณผ๊ฑฐ์—๋Š” ํŽ˜์ด์ง•์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ถ€๋ถ„ ๋ณด๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒˆ DataTable์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค(์ด๊ฒƒ์ด ์ข‹์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž„). ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น DataTable์˜ ๋ณด๊ธฐ๋ฅผ ItemsSource๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ณ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ํ•„์ˆ˜์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹คํžˆ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽ˜์ด์ง•์€ ์œ ์šฉํ•œ ๊ธฐ์ˆ ์ด๋ฉฐ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ ์ƒ๋‹นํ•œ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, DataGrid์˜ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ๊ฑฐ์˜ ์“ธ๋ชจ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. DataGrid์˜ ๋‹ค์Œ ๋ฒ„์ „์˜ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ํŽ˜์ด์ง•์€ ์ •๋ ฌ๊ณผ ํ•„ํ„ฐ๋ง์„ ์“ธ๋ชจ์—†๊ฒŒ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ๋œ ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 2๊ฐœ ๋˜๋Š” 3๊ฐœ์˜ ์—ด์ด ๋‚ ์งœ ์—ด์ด๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋‘ ๋ฒˆ์งธ ๋‚ ์งœ ์—ด์—์„œ ๊ฐ€์žฅ ์ตœ๊ทผ(๋˜๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜๋œ) ๋‚ ์งœ๊ฐ€ ์žˆ๋Š” ํ–‰์„ ๋ณด๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๋Š” ๋‘ ๋ฒˆ์งธ ๋‚ ์งœ ์—ด ๋จธ๋ฆฌ๊ธ€์„ ํด๋ฆญํ•˜์—ฌ ํ•ด๋‹น ์—ด์„ ๊ธฐ์ค€์œผ๋กœ DataGrid๋ฅผ ์ •๋ ฌํ•˜๊ณ , ํด๋ฆญํ•˜์—ฌ ์ •๋ ฌ ๋ฐฉํ–ฅ์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์—์„œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉ ์ค‘์ธ ํŽ˜์ด์ง•์ด ์—†๊ฑฐ๋‚˜ ์ด ํ–‰ ์ˆ˜๊ฐ€ ๋‹จ์ผ ํŽ˜์ด์ง€๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ž‘์€ ๊ฒฝ์šฐ์— ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“  ํ–‰ ์—์„œ ๊ฐ€์žฅ ์ตœ๊ทผ(๋˜๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜๋œ) ๋‚ ์งœ๋ฅผ ์ฐพ์•„์•ผ ํ•˜์ง€๋งŒ ํŽ˜์ด์ง•๋œ DataGrid GUI๋Š”

์ด๊ฒƒ์€ ์–ด๋–ค ํ–‰์ด ์–ด๋–ค ํŽ˜์ด์ง€์— ๋„์ฐฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋‹ต์€ ORDER BY ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” SQL SELECT ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€/ํ–‰์„ ์–ป์„ ๋•Œ ๊ฐ ํŽ˜์ด์ง€์— ์ผ๋ฐ˜์ ์œผ๋กœ ํ–‰์˜ ์‹ค์งˆ์ ์œผ๋กœ ์ž„์˜์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ด ํฌํ•จ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์‚ฌ์šฉ์ž์˜ ๊ด€์ ์—์„œ ๋ฌด์ž‘์œ„๊ฐ€ ์•„๋‹Œ ๋ฌด์ž‘์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.)

์˜์‚ฌ ๋‚œ์ˆ˜๋Š” ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ž„์˜์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด SQL ORDER BY (์ •๋ ฌ ๋ฐฉํ–ฅ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ASC ๋˜๋Š” DESC ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํŽ˜์ด์ง€๋Š” ์•„๋‹ˆ์˜ค์ž…๋‹ˆ๋‹ค. ๋” ๊ธด ๋ฌด์ž‘์œ„์ด์ง€๋งŒ ORDER BY ํ•ญ์ƒ ๋™์ผํ•œ ์—ด๊ณผ ๋™์ผํ•œ ์ •๋ ฌ ๋ฐฉํ–ฅ์œผ๋กœ ์ •๋ ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๊นจ์กŒ์Šต๋‹ˆ๋‹ค

์ด๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์—ด ํ—ค๋”๋ฅผ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ SQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. SQL ORDER BY ... ASC/DESC ๋Š” DataGrid์˜ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์ •๋ ฌ ์ˆœ์„œ์™€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. DataGrid๋Š” ํ˜„์žฌ ์ด๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์€ ์ด์ „ ๋ฉ”์‹œ์ง€์— ์žˆ์Šต๋‹ˆ๋‹ค . ์ €๋Š” DataGrid์—์„œ ์ •๋ ฌ์„ ์•ฑ(๋˜๋Š” "๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ชจ๋“ˆ")์— ์•„์›ƒ์†Œ์‹ฑํ•˜๋„๋ก ํ—ˆ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์•„์ด๋””์–ด๋ฅผ ํ†ตํ•ด ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์—ด ํ—ค๋” ๋“ฑ์„ ํด๋ฆญํ•˜์—ฌ DataGrid์˜ ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค ์•ฑ(๋˜๋Š” "๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ชจ๋“ˆ")์ด SQL ORDER BY ... ASC/DESC ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ฑ(์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ)์ด ์ •๋ ฌ์„ ์ทจ์†Œ ํ•˜๊ณ  ์ธ๊ณ„ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ ์ธ์ˆ˜์˜ ์„ค์ • ๊ฐ€๋Šฅํ•œ ์†์„ฑ์„ ๊ธฐ์กด ์ด๋ฒคํŠธ DataGrid.Sorting ์— ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ ์ด๋ฒคํŠธ ์ธ์ˆ˜๋Š” ์ •๋ ฌ ์ˆœ์„œ ๋ณ€๊ฒฝ์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์—ด ํ—ค๋” ๋“ฑ์„ ํด๋ฆญํ•˜์—ฌ ์š”์ฒญํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ DataGrid.Sorting ์ด๋ฒคํŠธ์˜ ์ด๋ฆ„์„ ๋œ ๋ชจํ˜ธํ•œ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ๋„ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ Sorting ์ด๋ฒคํŠธ์˜ ์˜๋„์™€ ๋ชฉ์ ์ด ๋ถˆ๋ถ„๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€์—์„œ ์ œ์•ˆ๋œ

Row๊ฐ€ ์žˆ๋Š” Windows Community Toolkit DataGrid์— ๋Œ€ํ•œ ์ข…์†์„ฑ
๊ธฐ๋Šฅ์œผ๋กœ์„œ์˜ ์„ธ๋ถ€์‚ฌํ•ญ(์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์ง€๋งŒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ)
์ด ์ƒˆ๋กœ์šด DataGrid๋ฅผ ๊ธฐ๋Šฅ์œผ๋กœ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ์ข‹์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ ํ–‰ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋™์‹œ์—. ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ–‰ ์„ธ๋ถ€ ์ •๋ณด ์„ฑ๋Šฅ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋งํฌ: https://github.com/windows-toolkit/WindowsCommunityToolkit/issues/2842
์žฌํ˜„: https://github.com/observito/DataGridRowDetailsPerfTest

์ข‹์€ ์ถœ๋ฐœ์ ์€ RadDataGrid(UWP ์˜คํ”ˆ ์†Œ์Šค)๊ฐ€ ์žˆ๋Š” ํŒŒํŠธ๋„ˆ Telerik๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ๊ณ ๊ฐ ์ค‘ ํ•œ ๋ช…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์‹ค์ œ๋กœ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋น ๋ฅด๊ณ  ๋‹ค์žฌ๋‹ค๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์–ด๋ ค์šด ์ ์€ ์ฝ”๋“œ๋ฟ์ž…๋‹ˆ๋‹ค. ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ž˜ ์ดํ•ดํ•˜์ง€ ์•Š๊ณ ๋Š” ์—”์ง„์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ƒˆ๋กœ์šด DataGrid๊ฐ€ Telerik๋งŒํผ ์„ฑ๋Šฅ์ด ์ข‹์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

syncfusion ๊ทธ๋ฆฌ๋“œ ๊ธฐ๋Šฅ์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ mvvm ์นœํ™”์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ๋” ์ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…• ๋‹ค์‹œ ๋ชจ๋‘! ์ด ๋Œ€ํ™”๋ฅผ ๊ณ„์†ํ•ฉ์‹œ๋‹ค. ํ˜„์žฌ ์กด์žฌํ•˜๋Š” DataGrid ๋ฌธ์„œ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์˜ ๋งํฌ ์ฃผ์š” ๋ฌธ์„œ ํŽ˜์ด์ง€์— ๊ทธ ๊ธฐํƒ€ ๊ด€๋ จ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๋งํฌ.

์ƒˆ๋กœ์šด DataGrid๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜๋ฐ˜๋˜๋Š” ๋ฌธ์„œ๊ฐ€ ์ตœ๊ณ  ์ˆ˜์ค€์ด๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ค‘์š”ํ•œ ๋ชจ๋“  ๋ฌธ์ œ์™€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ•ด๊ฒฐํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

_์šฐ๋ฆฌ๊ฐ€ ํ–ˆ์œผ๋ฉด ํ•˜๋Š” ์ฃผ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?_

์•ˆ๋…• ๋‹ค์‹œ ๋ชจ๋‘! ์ด ๋Œ€ํ™”๋ฅผ ๊ณ„์†ํ•ฉ์‹œ๋‹ค. ํ˜„์žฌ ์กด์žฌํ•˜๋Š” DataGrid ๋ฌธ์„œ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์˜ ๋งํฌ ์ฃผ์š” ๋ฌธ์„œ ํŽ˜์ด์ง€์— ๊ทธ ๊ธฐํƒ€ ๊ด€๋ จ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๋งํฌ.

์ƒˆ๋กœ์šด DataGrid๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜๋ฐ˜๋˜๋Š” ๋ฌธ์„œ๊ฐ€ ์ตœ๊ณ  ์ˆ˜์ค€์ด๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ค‘์š”ํ•œ ๋ชจ๋“  ๋ฌธ์ œ์™€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ•ด๊ฒฐํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

_์šฐ๋ฆฌ๊ฐ€ ํ–ˆ์œผ๋ฉด ํ•˜๋Š” ์ฃผ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?_

xaml ๋ฐ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ผ๋ฐ˜์ ์ธ DataGrid ์„ค์ •์„ ๋ณด์—ฌ์ฃผ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

xaml ๋ฐ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ผ๋ฐ˜์ ์ธ DataGrid ์„ค์ •์„ ๋ณด์—ฌ์ฃผ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@mdtauk "์ผ๋ฐ˜์ ์ธ" ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜๋Š” ํŠน์ • DataGrid ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜๋Š” DataGrid๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์„ ํƒ์ด๋ผ๊ณ  ์ผ๊ด€๋˜๊ฒŒ ์ฐพ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

xaml ๋ฐ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ผ๋ฐ˜์ ์ธ DataGrid ์„ค์ •์„ ๋ณด์—ฌ์ฃผ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@mdtauk "์ผ๋ฐ˜์ ์ธ" ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜๋Š” ํŠน์ • DataGrid ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜๋Š” DataGrid๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์„ ํƒ์ด๋ผ๊ณ  ์ผ๊ด€๋˜๊ฒŒ ์ฐพ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ผ๋ฐ˜์ ์ธ WPF, Win32 ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ/์•„์ด์ฝ˜ ๋ณด๊ธฐ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” WinUI 3.0 ๊ธฐ๊ฐ„์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Microsoft๊ฐ€ Fluent/Modern DataGrid UI ๋””์ž์ธ์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์ปจํŠธ๋กค ์ด๋ฉด์˜ ์•„์ด๋””์–ด๊ฐ€ ์ด์ „ UI์—์„œ WinUI 3์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@anawishnoff ์‚ฌ๋žŒ๋“ค์ด ์ด๋Ÿฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ฐพ๊ณ  ์žˆ๋‹ค๋Š” ์ ์—์„œ ํˆดํ‚ท์—์„œ ์–ป์€ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํ…Œ๋งˆ/์žฌํ…œํ”Œ๋ฆฟ/์ •๋ ฌ
  • ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ(์ผ๋ฐ˜์ ์œผ๋กœ XAML์—์„œ)
  • ์ด๋ฒคํŠธ/์„ ํƒ ์ฒ˜๋ฆฌ/์ผ€์ด์Šค
  • ํ–‰๋™ ์ˆ˜์ •(ํŠนํžˆ ํด๋ฆญ ์‹œ ์ˆ˜์ •)
  • ๋‹ค์ค‘ ํŽ˜์ด์ง•(#60 ๋ฐ #268๊ณผ ์ž˜ ์ง์„ ์ด๋ฃจ์–ด์•ผ ํ•จ)

    • ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์กฐ์ • ๋กœ๋“œ

  • ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ/์„œ์‹
  • ๋‹ค๋ฅธ ์—ด ๋ฐ์ดํ„ฐ ์œ ํ˜•(๋ฐ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•)(์˜ˆ: ์—ด๊ฑฐํ˜•)
  • ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด
  • ์ ‘๊ทผ์„ฑ

๊ธฐ์กด Toolkit DataGrid์—๋Š” ItemsSource ์†์„ฑ์— ๋Œ€ํ•ด IEnumerable์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋…ผ๋ฆฌ์ ์ธ ๊ฒฐ์ •์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ Windows.Storage.BulkAccess.FileInformationFactory.GetVirtualizedItemsVector()์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐœ์ฒด๋ฅผ ์ด ์†์„ฑ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (๋ฐ˜ํ™˜๋œ ๊ฐœ์ฒด๋ฅผ ์บ์ŠคํŒ…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋Š” ํ•œ) ๋˜ํ•œ ListView ๋ฐ GridView์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ปจํŠธ๋กค์€ ItemsSource ์†์„ฑ์„ ๊ฐœ์ฒด ์œ ํ˜• ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๋ฅผ ์ง€์›ํ•˜๋ฉด ์Šคํ† ๋ฆฌ์ง€ ์ž‘์—… ์ค‘์— ๋” ์‘๋‹ต์„ฑ์ด ๋›ฐ์–ด๋‚œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@mdtauk "์ผ๋ฐ˜์ ์ธ" ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜๋Š” ํŠน์ • DataGrid ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜๋Š” DataGrid๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์„ ํƒ์ด๋ผ๊ณ  ์ผ๊ด€๋˜๊ฒŒ ์ฐพ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ผ๋ฐ˜์ ์ธ WPF, Win32 ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ/์•„์ด์ฝ˜ ๋ณด๊ธฐ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” WinUI 3.0 ๊ธฐ๊ฐ„์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Microsoft๊ฐ€ Fluent/Modern DataGrid UI ๋””์ž์ธ์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์ปจํŠธ๋กค ์ด๋ฉด์˜ ์•„์ด๋””์–ด๊ฐ€ ์ด์ „ UI์—์„œ WinUI 3์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Win32 ์˜ˆ์ œ(ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ)
image

WPF ์˜ˆ์ œ
image

ํŒจ๋ธŒ๋ฆญ ์›น ์˜ˆ์ œ
image

UWP ์˜ˆ์ œ
image

@mdtauk ์Šคํฌ๋ฆฐ์ƒท ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ํ™•์‹คํžˆ ์ด์ „ ๋ฒ„์ „์˜ ์ปจํŠธ๋กค์—์„œ ์ž‘๋™ํ–ˆ๋˜ ํ•ต์‹ฌ ์š”์†Œ๋ฅผ ๊ฐ•์กฐํ•˜๊ณ  ์ƒˆ ์ปจํŠธ๋กค๋กœ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@michael-hawker ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ์ด ์Šค๋ ˆ๋“œ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์–ธ๊ธ‰๋œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์ œ๋ฅผ ๋ณด๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์‹œ์ž‘ํ•˜๊ธฐ์— ์ข‹์€ ๊ณณ์ž…๋‹ˆ๋‹ค.

@duke7553 ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์— ๋Œ€ํ•ด 100% ํ™•์‹ ํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด ์œ ํ˜•์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•œ ๊ฒƒ์ธ์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. @RBrid ๊ฐ€ ์ฐจ์ž„๋ฒจ์„

@anawishnoff & @duke7553 , ์ƒˆ WinUI ItemsRepeater ์ปจํŠธ๋กค ์œ„์— ์ƒˆ DataGrid ์ปจํŠธ๋กค์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์ปจํŠธ๋กค์€ ItemsSource๋ฅผ ๊ฐœ์ฒด๋กœ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
Object ItemsSource { get; set; };

Telerik์—์„œ์™€ ๊ฐ™์ด CellDecorationStyleSelector๋ฅผ ์ง€์›ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@anawishnoff

๊ธฐ๋ณธ WinUI ์ปจํŠธ๋กค๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ  "์กธ์—… ์ค‘"์ด๋ผ๊ณ  ํ•˜๋ฉด C++๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ๋„ ํฌํ•จ๋˜๋‚˜์š”? ํ˜„์žฌ WinUI์˜ DataGrid๋Š” C#์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. "์กธ์—…"์ด "๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ"๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ค‘์š”ํ•˜๊ฒŒ๋„, WinUI๋Š” WinUI ํŒ€์ด WinUI๊ฐ€ ์ค‘์š”ํ•œ ๋ชจ๋“  ๋ฉด์—์„œ WPF๋ณด๋‹ค ๋‚ซ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์ ์— ๋„๋‹ฌํ•ด์•ผ ํ•˜์ง€๋งŒ ์ด ๋ชฉํ‘œ๋Š” ๋„ˆ๋ฌด ๋Šฆ์—ˆ์Šต๋‹ˆ๋‹ค. C#์—์„œ C++๋กœ์˜ DataGrid์™€ ๊ฐ™์€ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ์— ์‹œ๊ฐ„/์ž์›์ด ๋‚ญ๋น„๋œ๋‹ค๋ฉด ์ด ๋ชฉํ‘œ๋Š” ํ›จ์”ฌ ๋” ๋Šฆ์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์›๋ž˜ C++๋กœ WinRT/UWP/WinUI๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„ ๊ทธ ์ด์œ ๋Š” ์‹คํ˜„๋˜์ง€ ์•Š์•˜๊ณ , ๊ตฌ๊ธ€/์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ์Šค๋งˆํŠธํฐ ์‹œ์žฅ ์ ์œ ์œจ์˜ ๋Œ€๋ถ€๋ถ„์„ ์ฐจ์ง€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— C++๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์›๋ž˜์˜ ์ด์œ ๋Š” ๋” ์ด์ƒ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์‰ฝ๊ฒŒ ๋’ค๋Šฆ๊ฒŒ ๋งํ–ˆ์ง€๋งŒ ๋” ์ผ์ฐ ๋งํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š์Œ). WinUI๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ C#์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค๋ฉด WPF๋ณด๋‹ค ๋” ๋‚˜์€ ๋ชฉํ‘œ๋Š” 3๋…„ ์ „์— ๋‹ฌ์„ฑํ–ˆ์„ ๊ฒƒ์ด์ง€๋งŒ ์ง€๊ธˆ์€ 8๋…„์ด ์ง€๋‚ฌ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‹ฌ์„ฑ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์•„๋ฌด๋„ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•  ๋•Œ ์ •ํ™•ํ•˜๊ฒŒ ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. WPF๋ณด๋‹ค ๋‚˜์€ ๋ชฉํ‘œ์™€ WinUI DataGrid "์กธ์—…" ๋ชฉํ‘œ๊ฐ€ ๋” ์˜ค๋ž˜๋˜๊ณ  ๋œ ์ƒ์‚ฐ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ์˜ ๋ถˆํ•„์š”ํ•œ ๋ณ€ํ™˜์œผ๋กœ ์ธํ•ด ์ง€์—ฐ๋˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ €๋Š” C#์ด ์กด์žฌํ•˜๊ธฐ๋„ ์ „์— C++๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‹œ์ž‘ํ–ˆ๊ณ  ์‚ฌ๋žŒ๋“ค์€ ์›๋ž˜ ๋ฐฐ์šด ๊ฒƒ์„ ๊ณ ์ˆ˜ํ•˜๊ณ  _"์ข‹์€ ์˜›๋‚ "_์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— C++์— ํŽธํ–ฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. C++์— ๋Œ€ํ•œ ํŽธ๊ฒฌ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  C++ ์ž‘์„ฑ์„ ์ค‘๋‹จํ–ˆ๊ณ  DataGrid๋ฅผ C++๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜์—ฌ ์ง€์—ฐํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. C#์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์ด ๋ฌธ์ œ์—์„œ ์‚ฌ๋žŒ๋“ค์ด ์ œ์•ˆํ•œ ๋‹ค์–‘ํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์„ ๋งŒ๋“ค๊ณ  10๋…„์ด ๋˜๊ธฐ ์ „์— WPF๋ณด๋‹ค ๋‚˜์€ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋” ์ค‘์š”ํ•œ ์ผ์— ์ง‘์ค‘ํ•˜์‹ญ์‹œ์˜ค.

์ €๋Š” WinUI์˜ ์—ฌ๋Ÿฌ ์ธก๋ฉด์„ ์‚ฌ๋ž‘ํ•˜๊ณ , WinUI์˜ ๋งŽ์€ ์˜๋ฆฌํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์— ๊ฐ์‚ฌํ•˜๋ฉฐ, WinUI์šฉ ์•ฑ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์†”์งํ•œ ์ง„์‹ค์„ ์•Œ๊ณ  ์‹ถ์œผ์‹ญ๋‹ˆ๊นŒ? ์ง„์‹ค์€, ์Šฌํ”„๊ฒŒ๋„ ์•„์ง ์–ด๋Š ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ WinUI ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ํ•ด์ œ๋˜์ง€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ์ถœ์‹œ๋œ ์†Œํ”„ํŠธ์›จ์–ด๋Š” WPF๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๊ณ  GUI ํ˜„๋Œ€ํ™”๋ฅผ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. WinUI์šฉ ์•ฑ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ž‘์„ฑํ–ˆ์ง€๋งŒ, ๋ชจ๋‘ ์ค€๋น„, ๊ณ„ํš, ํ…Œ์ŠคํŠธ, ๋Œ€๊ธฐ์ด๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ”๋ผ๊ฑด๋Œ€ ๋‚ด๋…„์—๋Š” ์ฒซ ๋ฒˆ์งธ WinUI ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ถœ์‹œ๋˜์ง€๋งŒ ์ €๋Š” ์ด ์ „ํ™˜์„ ์‚ฌ์šฉ์ž๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋†’์ด ํ‰๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๊ณ„ํš๋Œ€๋กœ ์ง„ํ–‰๋œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž๋Š” ์ „ํ™˜์„ ๊ฑฐ์˜ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Microsoft์˜ ๊ด€์ ์—์„œ WinRT/UWP๋Š” 2012๋…„๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒŒ์‹œ๋œ ๋ฆด๋ฆฌ์Šค ํ’ˆ์งˆ์˜ ์†Œํ”„ํŠธ์›จ์–ด์ด์ง€๋งŒ ๋‚ด ๊ด€์ ์—์„œ UWP๋Š” ์—ฌ์ „ํžˆ ํฐ ์‹คํ—˜์ž…๋‹ˆ๋‹ค. ์ €์—๊ฒŒ UWP(WinUI ํฌํ•จ)๋Š” ๋ชจ๋‘ ์ œ๊ฐ€ ์ˆ˜๋…„๊ฐ„ ๊ฐ€์ง€๊ณ  ๋†€์•„์˜จ

UWP์˜ ์ฒ˜์Œ ๋ช‡ ๋…„ ๋™์•ˆ ๋งค๋…„ ์ €๋Š” ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. _"์—๋Ÿฌ... ๋‚ด๋…„๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. WPF์—๋Š” ์•„์ง UWP์— ์—†๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค. ๋‚ด๋…„์—๋Š” ํ™•์‹คํžˆ ๋” ๋‚˜์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค."_
๊ทธ๋ฆฌ๊ณ  ์ด๋“ฌํ•ด๊ฐ€ ์™”๊ณ  ๋‚˜๋Š” ๊ฐ™์€ ์ƒ๊ฐ์„ ๋ฐ˜๋ณตํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋“ฌํ•ด๊ฐ€ ์™”๊ณ  ๋‚˜๋Š” ๊ฐ™์€ ์ƒ๊ฐ์„ ๋ฐ˜๋ณตํ–ˆ๋‹ค. ๋ฐ”๋ผ๊ฑด๋Œ€ ์˜ฌํ•ด๋Š” ๊ทธ ๋ง์˜ ๋งˆ์ง€๋ง‰ ํ•ด์ด๊ฑฐ๋‚˜ ์ ์–ด๋„ ๊ทธ๊ฒƒ์ด ๋‚ด ์˜๋„์ž…๋‹ˆ๋‹ค.

WinUI๋Š” ๋” ์ด์ƒ ์ง€์—ฐ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. WinUI์˜ DataGrid๋ฅผ C# ์ฝ”๋“œ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๋ ค๋ฉด C#์—์„œ ๋” ๋งŽ์€ WinUI ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ์ด์ œ 8๋…„์ด ์ง€๋‚ฌ๊ณ  Android๋Š” ์—„์ฒญ๋‚œ ์‹œ์žฅ ์ ์œ ์œจ์„ ์ฐจ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ฌ๊ฐํ•œ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๊ธฐ์ˆ ์ ์œผ๋กœ UWP๋Š” ๋ฒ ํƒ€๊ฐ€ ์•„๋‹Œ ์•ŒํŒŒ ๋ฒ„์ „์˜ ์ •์˜์™€ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— UWP๊ฐ€ ์—ฌ์ „ํžˆ ๋ฒ ํƒ€ ๋ฒ„์ „์ด๋ผ๊ณ  ๋งํ•  ๋•Œ ๋‚˜๋Š” ์‹ค์ œ๋กœ ์นœ์ ˆํ•˜๊ณ  ๊ด€๋Œ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง„์ •ํ•œ ๋ฒ ํƒ€ ๋ฒ„์ „์ด ๋˜๋ ค๋ฉด ๊ธฐ๋Šฅ์ด ์™„์ „ํ•ด์•ผ ํ•˜์ง€๋งŒ UWP๋Š” ์•„์ง ๊ธฐ๋Šฅ์ด ์™„์„ฑ๋œ ์ƒํƒœ์— ๋„๋‹ฌํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ UWP๋Š” ์—ฌ์ „ํžˆ ์•ŒํŒŒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Wikipedia์˜ "์†Œํ”„ํŠธ์›จ์–ด ๋ฆด๋ฆฌ์Šค ์ˆ˜๋ช… ์ฃผ๊ธฐ" ๊ธฐ์‚ฌ ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

"๋ฒ ํƒ€ ๋‹จ๊ณ„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ธฐ๋Šฅ์ด ์™„์ „ํ•˜์ง€๋งŒ ์•Œ๋ ค์ง€๊ฑฐ๋‚˜ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๋ฒ„๊ทธ๊ฐ€ ๋งŽ์ด ํฌํ•จ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์„ ๋•Œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค."
"์•ŒํŒŒ ์†Œํ”„ํŠธ์›จ์–ด์—๋Š” ์ตœ์ข… ๋ฒ„์ „์— ๋Œ€ํ•ด ๊ณ„ํš๋œ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

Wikipedia๋Š” "๊ธฐ๋Šฅ ์™„๋ฃŒ" ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด

"์†Œํ”„ํŠธ์›จ์–ด์˜ ์™„์ „ํ•œ ๊ธฐ๋Šฅ ๋ฒ„์ „์€ ๊ณ„ํš๋œ ๋˜๋Š” ์ฃผ์š” ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ ๋ฒ„๊ทธ, ์„ฑ๋Šฅ ๋˜๋Š” ์•ˆ์ •์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด ์•„์ง ์ตœ์ข… ๋ฒ„์ „์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ ์•ŒํŒŒ ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค."

UWP๊ฐ€ ์™„์ „ํ•œ ๊ธฐ๋Šฅ์ด๋ผ๋ฉด UWP์—๋Š” Windows 95 ์ด์ƒ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UWP๋Š” ์•„์ง ๋ชจ๋“  ์˜์—ญ์—์„œ Windows 95๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. . Windows 95๋Š” 25๋…„ ์ „์— ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. UWP/WinRT๊ฐ€ 7~8๋…„ ์ „์— ์ถœ์‹œ๋˜์—ˆ์„ ๋•Œ Microsoft๋Š” 9์–ต ๋‹ฌ๋Ÿฌ์˜ ์†์‹ค๊ณผ Windows ์Šคํ† ์–ด์—์„œ ์‹ฌ๊ฐํ•œ ์•ฑ ๋ถ€์กฑ์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์ด๋ผ๊ณ  ํ‘œ์‹œ๋œ ์•ŒํŒŒ ๋ฒ„์ „์ด๋ฏ€๋กœ ์•ฑ ๊ฐœ๋ฐœ์ž๋Š” ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ 8๋…„์ด ์ง€๋‚œ ์˜ค๋Š˜, ๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์•ŒํŒŒ ๋ฒ„์ „์ด๊ณ  ๋งค์šฐ ๊ธฐํ•œ์ด ์ง€๋‚ฌ์œผ๋ฉฐ ์—ฌ์ „ํžˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๋ณด๊ณ  ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Microsoft๊ฐ€ UWP์˜ ์ง„์ •ํ•œ ๋ฒ ํƒ€ ๋ฒ„์ „ ์ƒ์‚ฐ์— ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋‘๊ณ  ์ง„์ •ํ•œ ๋ฆด๋ฆฌ์Šค ํ›„๋ณด ๋ฒ„์ „์ด ์‹ ์†ํ•˜๊ฒŒ ๋’ค๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๋„๋ก ์ง„์ง€ํ•œ ๊ฒฐ์ •/์•ฝ์†์„ ๋‚ด๋ฆฐ๋‹ค๋ฉด Microsoft์™€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งค์šฐ ์œ ์ตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ๊ถŒ์žฅ๋˜๋ฉฐ ๋งค์šฐ ํ•ฉ๋ฆฌ์ ์ธ ์กฐ์น˜์ž…๋‹ˆ๋‹ค. ๋ชจ๋‘์—๊ฒŒ ํƒ์›”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

UWP๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ์—ฌ์ „ํžˆ ์•ŒํŒŒ/๋ถˆ์™„์ „ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด: 25๋…„ ์ „์—๋Š” Windows 95์—์„œ "MoveFile" ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์ด๋‚˜ ํด๋”๋ฅผ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์‰ฌ์› ์Šต๋‹ˆ๋‹ค(ํ•จ์ˆ˜ ์ด๋ฆ„์ด "MoveFile"์ด์—ˆ์ง€๋งŒ ๋‘ ํŒŒ์ผ์„ ๋ชจ๋‘ ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ ํด๋”). UWP์—์„œ ํด๋”๋ฅผ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ์•„๋‹ˆ, ์•„์ง. ๋ถ„๋ช…ํžˆ ํด๋”๋ฅผ ์ด๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ณธ ํ•„์ˆ˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ด์ง€๋งŒ UWP์—๋Š” ์—ฌ์ „ํžˆ ์ด ํ•„์ˆ˜ ๊ธฐ๋Šฅ ๋ฐ ๊ธฐํƒ€ ๊ธฐ๋Šฅ์ด ๋ˆ„๋ฝ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ UWP๋ฅผ ์™„์ „ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ๋น„ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ UWP๋Š” ์•„์ง ๋ฒ ํƒ€ ์ƒํƒœ์— ๋„๋‹ฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. 7-8๋…„ ์ „์— ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Microsoft๋Š” UWP์˜ ์ง„์ •ํ•œ ๋ฒ ํƒ€ ๋ฒ„์ „์„ ์šฐ์„ ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ UWP ๋ฌธ์ œ(UI ๋ฌธ์ œ ์ œ์™ธ)๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐœ GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋˜๋Š” UWP ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ฐพ์„ ์ˆ˜ ์—†์Œ). ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ด๋Š” ๊ณต๊ฐœ ๋ฌธ์ œ ์ถ”์  ์ €์žฅ์†Œ๊ฐ€ ์•ŒํŒŒ ๋‹จ๊ณ„์—์„œ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์•ŒํŒŒ ๋ฒ„์ „์˜ ์ •์˜์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ง„์ •ํ•œ ๋ฒ ํƒ€ ๋˜๋Š” ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์ด์—ˆ๋‹ค๋ฉด ๊ณต๊ฐœ ๋ฌธ์ œ ์ถ”์  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์ด๋ฏธ ์—ด๋ ธ์„ ๊ฒƒ์ด๊ณ  UWP์—๋Š” Windows 95 ๋ฐ Windows 7 ๋“ฑ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ƒํ™ฉ์€ DataGrid์— ์–ด๋–ค ์˜ํ–ฅ์„ ์ค๋‹ˆ๊นŒ? ๊ธฐ๋Šฅ์ด ์™„๋น„๋œ UWP ๋ฒ ํƒ€ ๋ฒ„์ „์ด ๋„ˆ๋ฌด ๋Šฆ๊ฒŒ ์ถœ์‹œ๋˜์—ˆ๋‹ค๋Š” ์ ๊ณผ ์ด ์ƒํ™ฉ์˜ ์‹ฌ๊ฐ์„ฑ๊ณผ ๊ฒฐ๊ณผ์ ์œผ๋กœ Microsoft๊ฐ€ ์ž…์€ ์ˆ˜์‹ญ์–ต ๋‹ฌ๋Ÿฌ์˜ ์†์‹ค์„ ๊ณ ๋ คํ•  ๋•Œ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๋Š” ๊ฒƒ์€ ์ •๋‹นํ™”๋˜๊ณ  ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. WinUI DataGrid๋ฅผ ๋น„๊ด€๋ฆฌ ์ฝ”๋“œ ๋ฐ ์ด์ „ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Microsoft๋Š” C# ๋ฐ "๊ด€๋ฆฌ ์ฝ”๋“œ"์˜ ํฐ ์ด์ ์ด ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ์ด๋ผ๊ณ  ๋ฐ˜๋ณตํ•ด์„œ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. "๊ด€๋ฆฌ ์ฝ”๋“œ"์— ๋Œ€ํ•œ Microsoft์˜ ์ฃผ์žฅ์€ C++ ๋ฐ C#์— ๋Œ€ํ•œ ์ œ ๊ฒฝํ—˜์—์„œ ํ™•์‹คํžˆ ์‚ฌ์‹ค์ด์—ˆ์Šต๋‹ˆ๋‹ค. UWP๋Š” ๋ฒ„์ „ 1.0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ด€๋ฆฌ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ๋กœ ์ž‘์„ฑ๋œ ๊ฒฝ์šฐ ๋ช‡ ๋…„ ์ „์— ์ง„์ •ํ•œ ๋ฒ ํƒ€ ์ƒํƒœ์— ๋„๋‹ฌํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ด€๋ฆฌ ์ฝ”๋“œ์—์„œ ๋น„๊ด€๋ฆฌ ์ฝ”๋“œ๋กœ ์ด๋Ÿฌํ•œ ๋ถˆํ•„์š”ํ•œ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ๋ฅผ ๋” ๋งŽ์ด ์ˆ˜ํ–‰ํ•˜์—ฌ ์ƒํ™ฉ์ด ๋” ์•…ํ™”๋˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋น„๊ต๋ฅผ ์œ„ํ•ด 2006๋…„๋ถ€ํ„ฐ 2010๋…„๊นŒ์ง€ 4๋…„ ๋™์•ˆ ๋Œ€๋ถ€๋ถ„์˜ WPF๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. WPF๋Š” UWP์™€ ๋‹ฌ๋ฆฌ ์ฃผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. UWP๋Š” ๋น„๊ด€๋ฆฌ ์ฝ”๋“œ์ด๋ฉฐ 8๋…„์˜ ๊ฐœ๋ฐœ ํ›„์—๋„ Windows 95๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜์—ญ์—์„œ ์—ฌ์ „ํžˆ UWP๋ฅผ ๋Šฅ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Microsoft๊ฐ€ ๊ด€๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ์„ ๋•Œ Microsoft๋Š” ๋ถ„๋ช…ํžˆ ์˜ณ์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ํ”„๋กœ์ ํŠธ ๋ชจ๋‘ ์†Œ์œ ์ž(Microsoft)๊ฐ€ ๋™์ผํ•˜๋ฏ€๋กœ WinUI๊ฐ€ WPF์—์„œ ์ฝ”๋“œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— WinUI๋Š” WPF๋ณด๋‹ค ํ›จ์”ฌ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ WinUI๋Š” WPF ๊ฐœ๋ฐœ ์‹œ๊ฐ„์˜ ์•ฝ ์ ˆ๋ฐ˜์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ WinUI๋Š” ์‹œ์ž‘๋˜์ง€ ์•Š์•˜์–ด์•ผ ํ–ˆ์œผ๋ฉฐ Microsoft๋Š” WPF์˜ ์ƒˆ ๋ฒ„์ „์—์„œ WinUI์˜ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. WinUI๋Š” WPF 5.0์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒํ™ฉ์€ ํฐ ํ˜ผ๋ž€์ด์—ˆ๊ณ  Microsoft๊ฐ€ ์ด ํ˜ผ๋ž€์˜ ๋‚˜๋จธ์ง€ ์ •๋ฆฌ๋ฅผ ์šฐ์„ ์‹œํ•˜๊ณ  ์ˆ˜์‹ญ์–ต ๋‹ฌ๋Ÿฌ์˜ ์‹ค์ˆ˜๋ฅผ ์ด๋ฏธ๋ณด๋‹ค ๋” ์•…ํ™”์‹œํ‚ค๋Š” ์ผ์„ ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ ์ตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ์˜ ์Šค๋งˆํŠธํฐ ์‹œ์žฅ ์ ์œ ์œจ ์ƒํ™ฉ์—์„œ).

์ฆ‰, ๋” ๋งŽ์€ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Microsoft๋Š” Microsoft๊ฐ€ ๊ณผ๊ฑฐ์— ์ด๋ฏธ ๋งํ•œ/์•Œ๊ณ  ์žˆ๋˜ ๋‚ด์šฉ์„ ๊ธฐ์–ตํ•จ์œผ๋กœ์จ ์ด์ต์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Microsoft์˜ ์ž์ฒด ์ฃผ์žฅ์— ๋”ฐ๋ฅด๋ฉด ๊ด€๋ฆฌ ์ฝ”๋“œ๋Š” ์ƒ์‚ฐ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. WPF์˜ 4๋…„๊ณผ ๋น„๊ตํ•˜์—ฌ UWP์˜ 8๋…„์„ ๋ณผ ๋•Œ ๊ฒฐ๋ก ์€ ๊ด€๋ฆฌ ์ฝ”๋“œ์˜ ์ด์ ์— ๋Œ€ํ•ด Microsoft๊ฐ€ ์˜ณ์•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๋Š” ์Šคํฌ๋ฆฝํŒ…์šฉ์ด๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์šฉ์ž…๋‹ˆ๋‹ค. JavaScript์™€ PowerShell์€ ์˜๋„ํ•œ ๋ชฉ์ (์Šคํฌ๋ฆฝํŒ…)์—๋Š” ์ ํ•ฉํ•˜์ง€๋งŒ ์•ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—๋Š” ๋ถ„๋ช…ํžˆ ๋ถ€์ ํ•ฉํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค.
  • ์„ฑ๊ณตํ•˜๋ ค๋ฉด Microsoft๋Š” ์•ŒํŒŒ์—์„œ ๋ฒ ํƒ€๋กœ, ๋ฆด๋ฆฌ์Šค๋กœ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ ์ด๋Š” "๋ฆด๋ฆฌ์Šค"๋ผ๋Š” ๋ ˆ์ด๋ธ”์ด ๋ถ™์€ ๋ถˆ์™„์ „ํ•œ ์•ŒํŒŒ๊ฐ€ ์•„๋‹ˆ๋ผ ์ง„์ •ํ•œ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์ธ ๊ฒฝ์šฐ์—๋งŒ ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Microsoft Store๋Š” ์ง€๋‚˜์น˜๊ฒŒ ์˜ค๋žซ๋™์•ˆ ๋น„์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด์™€ ๊ธฐํƒ€ ์ง์›์€ ํ•ฉ๋‹นํ•œ ๋ณด์ˆ˜, ํ•ฉ๋‹นํ•œ ๊ทผ๋ฌด ์‹œ๊ฐ„, ๊ฑด๊ฐ•ํ•œ ๊ทผ๋ฌด ํ™˜๊ฒฝ์„ ๋Œ€๊ฐ€๋กœ ์ผํ•  ๋•Œ ๊ฐ€์žฅ ์ž˜ ์ผํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ, Microsoft์˜ ์ˆ˜์‹ญ์–ต ๋‹ฌ๋Ÿฌ ์†์‹ค์€ ๋ฌด๊ธ‰ ๊ด‘์‹ ์ž/๊ด‘์‹ ๋„์™€ ์†Œ์œ„ "์ฃผ๊ฐ„ ์ž‘์—…" ๋ฐ "์•ผ๊ฐ„ ์ž‘์—…"๊ณผ ์ง€์† ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฑด๊ฐ•์— ํ•ด๋กœ์šด ์ž‘์—… ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • Android์˜ ๊ฑฐ๋Œ€ํ•œ ์‹œ์žฅ ์ ์œ ์œจ ์Šน๋ฆฌ๋Š” ๋ฌด๋ณด์ˆ˜ ๊ด‘์‹ ๋„ ๋•๋ถ„์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌด๋ณด์ˆ˜ ๊ด‘์‹ ๋„๊ฐ€ ์Šน๋ฆฌ์˜ ์ด์œ ์˜€๋‹ค๋ฉด Linux๋Š” ์‹คํŒจํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ค๋ช…์€ ํ›จ์”ฌ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Android ํƒœ๋ธ”๋ฆฟ ๋ฐ ์Šค๋งˆํŠธํฐ์˜ ๊ฐ€๊ฒฉ์€ Windows ํƒœ๋ธ”๋ฆฟ ๋ฐ ์Šค๋งˆํŠธํฐ๋ณด๋‹ค ํ›จ์”ฌ ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์ตœ์ข… ์‚ฌ์šฉ์ž๋Š” "์˜คํ”ˆ ์†Œ์Šค" ์ข…๊ต/์ด๋ฐ์˜ฌ๋กœ๊ธฐ์— ๊ด€์‹ฌ์ด ์—†์œผ๋ฉฐ(์‚ฌ์šฉ์ž๋Š” ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€์กฐ์ฐจ ๋ชจ๋ฆ…๋‹ˆ๋‹ค), ๊ทธ์ € Android ๊ธฐ๊ธฐ์˜ ์ €๋ ดํ•œ ๊ฐ€๊ฒฉ์„ ์ข‹์•„ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.
  • Win16์€ ๋งค์šฐ ๊ตฌ์‹์ž…๋‹ˆ๋‹ค. 20-30๋…„ ์ „, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดˆ๊ธฐ "Wild West" ์‹œ์ ˆ๋ถ€ํ„ฐ์˜ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Win16 ๊ธฐ๋ฐ˜์˜ ์ƒˆ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์ค‘์ง€ํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๊ฒƒ์„ "Win32"๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ์—ฌ์ „ํžˆ ๊ทผ๋ณธ์ ์œผ๋กœ Win16์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์‹ค์ œ๋กœ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Win32๋Š” ํฌ์ธํ„ฐ ํฌ๊ธฐ๊ฐ€ 16๋น„ํŠธ์—์„œ 32๋น„ํŠธ๋กœ ํ™•์žฅ๋˜์—ˆ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” Win16๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. Microsoft์˜ ๋„ˆ๋ฌด ๋งŽ์€ ๊ทธ๋ฃน์ด Win16/32๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ ์ฝ”๋“œ๋ฅผ ๊ณ„์† ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋ฉฐ ํฐ ์ž์› ๋‚ญ๋น„์ž…๋‹ˆ๋‹ค.

@anawishnoff

๊ธฐ๋ณธ WinUI ์ปจํŠธ๋กค๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Wikipedia์˜ "๋งค๋ชฐ ๋น„์šฉ" ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋งค๋ชฐ ๋น„์šฉ ํšจ๊ณผ(๋˜๋Š” ์ฝฉ์ฝ”๋“œ ํšจ๊ณผ)๋Š” ํ–‰๋™์ด ์ข…์ข… ๋งค๋ชฐ ๋น„์šฉ ์˜ค๋ฅ˜๋ฅผ ๋”ฐ๋ฅธ๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ "๋ˆ, ๋…ธ๋ ฅ ๋˜๋Š” ์‹œ๊ฐ„์— ๋Œ€ํ•œ ํˆฌ์ž๊ฐ€ ์ด๋ฃจ์–ด์ง€๋ฉด ๋…ธ๋ ฅ์„ ๊ณ„์†ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ๋” ์ปค์ง‘๋‹ˆ๋‹ค." ์ด ํ–‰๋™์€ "์ข‹์€ ๋ˆ์„ ๋‚˜์œ ๋ฐ๋กœ ๋˜์ง€๋Š” ๊ฒƒ"์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ๊ฒƒ์— ๊ตด๋ณตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ "์†์‹ค์„ ์ค„์ด๋Š” ๊ฒƒ"์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์œ ์‚ฌํ•˜๊ฒŒ "๊ณ„ํš ์ง€์† ํŽธํ–ฅ" :

๊ณ„ํš ์ง€์† ํŽธํ–ฅ, get-the-itis ๋˜๋Š” press-on-itis๋Š” ์‹คํŒจํ•œ ๊ณ„ํš์„ ์ง€์†ํ•˜๋ ค๋Š” ํ˜„๋ช…ํ•˜์ง€ ๋ชปํ•œ ๊ฒฝํ–ฅ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์น˜๋ช…์ ์ธ ์žฌ๋‚œ์œผ๋กœ ์ด์–ด์งˆ ๋•Œ ๊ณ„ํš๋œ ์ฝ”์Šค๋ฅผ ๊ณ ์ˆ˜ํ•  ์ˆ˜ ์žˆ๊ณ  ๋Œ€์‹  ์ค‘๋‹จํ•ด์•ผ ํ•˜๋Š” ์„ ์žฅ์ด๋‚˜ ํ•ญ๊ณต๊ธฐ ์กฐ์ข…์‚ฌ์—๊ฒŒ ์œ„ํ—˜ํ•œ ์œ„ํ—˜์ž…๋‹ˆ๋‹ค. ..... ํ”„๋กœ์ ํŠธ๋Š” ๊ณผ๋„ํ•œ ๋‚™๊ด€์ฃผ์˜, ์‹คํŒจ๋ฅผ ์ธ์ •ํ•˜์ง€ ์•Š๋Š” ํƒœ๋„, ์ง‘๋‹จ ์‚ฌ๊ณ , ๋งค๋ชฐ ๋น„์šฉ ์†์‹ค์— ๋Œ€ํ•œ ํ˜์˜ค๋ฅผ ํฌํ•จํ•˜๋Š” ๊ณ„ํš ์˜ค๋ฅ˜ ๋ฐ ๊ด€๋ จ ์š”์ธ์œผ๋กœ ์ธํ•ด ์ข…์ข… ๋น„์šฉ ์ดˆ๊ณผ ๋ฐ ์ง€์—ฐ์„ ๊ฒช์Šต๋‹ˆ๋‹ค.

WinRT/UWP๋กœ ์ธํ•ด Microsoft๋Š” ์ฒซ ํ•ด ๋˜๋Š” ๋‘ ๋ฒˆ์งธ ํ•ด์— 9์–ต ๋‹ฌ๋Ÿฌ์˜ ์†์‹ค์„ ๋ณด์•˜๊ณ  ๋„ˆ๋ฌด ์˜ค๋žซ๋™์•ˆ ๋น„์–ด ์žˆ๋Š” ์•ฑ ์Šคํ† ์–ด๋ฅผ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค. WinRT/UWP๋Š” ์น˜๋ช…์ ์ธ ์‹คํŒจ์˜€์œผ๋ฏ€๋กœ ๋‘ ๋ฒˆ์งธ ํ•ด์— ์ค‘๋‹จ๋˜์–ด์•ผ ํ–ˆ์ง€๋งŒ "๊ณ„ํš ์ง€์† ํŽธํ–ฅ"๊ณผ ๋งค๋ชฐ ๋น„์šฉ ์†์‹ค์— ๋Œ€ํ•œ ํ˜์˜ค ๋•Œ๋ฌธ์— ๊ณ„์†๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‚ด์šฉ์€ ๊ด€๋ฆฌ ๊ณผ์ •์—์„œ ๊ฐ€๋ฅด์นฉ๋‹ˆ๋‹ค. ๊ณ„ํš ์ง€์†์ด ๊ฒฐ๊ตญ WinRT/UWP์˜ ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ๋˜๋Œ๋ ธ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ์š”, ์Šค๋งˆํŠธํฐ ์‹œ์žฅ ์ ์œ ์œจ ์ธก๋ฉด์—์„œ ๋ณด๋ฉด ์˜ค๋Š˜๋‚ ์—๋„ ์—ฌ์ „ํžˆ ์น˜๋ช…์ ์ธ ์‹คํŒจ์ž…๋‹ˆ๋‹ค. Wikipedia์˜ ์ด๋Ÿฌํ•œ ์„ค๋ช…์€ UWP์˜ ์ƒํ™ฉ์„ ์ •ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” WinRT/UWP๊ฐ€ ์ถœ์‹œ๋œ ์ง€ 7~8๋…„์ด ์ง€๋‚œ ํ˜„์žฌ ์‹œ์ ์—์„œ UWP๋ฅผ ์ทจ์†Œํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋Šฆ์—ˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. " ๋ฐ ๋งค๋ชฐ ๋น„์šฉ ์†์‹ค์— ๋Œ€ํ•œ ํ˜์˜ค๊ฐ.

๊ทธ๋ ‡๋‹ค๋ฉด ์ƒํ™ฉ์„ ๊ตฌ์ถœํ•˜๊ธฐ ์œ„ํ•ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ช‡ ๋…„ ์ „์— ํ™•์‹คํžˆ ์ทจ์†Œํ–ˆ์–ด์•ผ ํ–ˆ์ง€๋งŒ UWP๋ฅผ ์ทจ์†Œํ•œ๋‹ค๊ณ  ์ƒํ™ฉ์„ ๊ตฌํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ WinRT๊ฐ€ ๊ฐ€ํ•œ ๋ง‰๋Œ€ํ•œ ํ”ผํ•ด๋ฅผ ์ˆ˜์šฉํ•˜๋˜ ๋” ์ด์ƒ ํ”ผํ•ด๋ฅผ ์ž…ํžˆ์ง€ ์•Š๊ณ  ํ”„๋กœ์ ํŠธ์˜ ์ ˆ์ฐจ/์ •์ฑ…์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, WinRT์˜ ๋™์ผํ•œ ์น˜๋ช…์ ์ธ ์‹ค์ˆ˜๋ฅผ ๋ฐ˜๋ณต/๊ณ„์†ํ•˜๋Š” ๊ฒƒ์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋Ÿฌํ•œ ๋งŽ์€ ์–‘์˜ ๊ด€๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋น„์ƒ์‚ฐ์ ์ธ ์˜ค๋ž˜๋œ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” "๋„ค์ดํ‹ฐ๋ธŒ" ์ฝ”๋“œ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ง„์ •ํ•œ ๋ฒ ํƒ€ ์ƒํƒœ์— ๋„๋‹ฌํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ง€์—ฐ์€ ์ด๋ฏธ ๋งค์šฐ ํฝ๋‹ˆ๋‹ค. ์ง€์—ฐ์„ ๋” ์•…ํ™”์‹œํ‚ค๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

DataGrid๊ฐ€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” "๋„ค์ดํ‹ฐ๋ธŒ" ์ฝ”๋“œ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ๋˜๋ฉด "๊ณ„ํš ์ง€์† ํŽธํ–ฅ"/๋งค๋ชฐ ๋น„์šฉ ์‹ค์ˆ˜๊ฐ€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. WinRT/UWP์™€ ๊ฐ™์€ ์น˜๋ช…์ ์ธ ์‹ค์ˆ˜๋ฅผ ์ €์งˆ๋ €์„ ๋•Œ ์ด ๊ฐ™์€ ์‹ค์ˆ˜๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณต๋˜๋ฉด ํ›จ์”ฌ ๋” ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค. ํ”ผํ•ด๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. WinRT์˜ ์น˜๋ช…์ ์ธ ์‹คํŒจ๋กœ๋ถ€ํ„ฐ ๋ฐฐ์šฐ๊ณ  ์ง€์†์ ์ธ ํ˜ˆ์•ก ์†์‹ค์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ถ•๋Œ€๋ฅผ ์ ์šฉํ•ด์•ผ ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค.

DataGrid๋ฅผ ๋น„๊ด€๋ฆฌ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๋„์„œ๊ด€์— ๊ฐ€์„œ ๊ฐ€์žฅ ๋งŽ์€ ์ง€์‹/๊ฒฝํ—˜์„ ๊ฐ€์ง„ ์ตœ๊ณ ์˜ ์ €์ž๋กœ๋ถ€ํ„ฐ ์ตœ๊ณ ์˜ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ์ฑ…์„ ๋ชจ๋‘ ๋นŒ๋ฆฐ ๋‹ค์Œ ์ด ๋ชจ๋“  ์šฐ์ˆ˜ํ•œ ๊ด€๋ฆฌ ์ฑ…์„ ๋ชจ๋‹ฅ๋ถˆ์— ๋˜์ง€๊ณ  ํƒ€๋Š” ๊ฒƒ์„ ์ง€์ผœ๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@verelpode DataGrid์— ๋Œ€ํ•œ ๋‘ ๊ฐœ์˜ ๋งค์šฐ ํฐ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์š”์ ์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์œ„์˜ ํ”ผ๋“œ๋ฐฑ์ด ๊ตฌ์ฒด์ ์œผ๋กœ OOB DataGrid ์ปจํŠธ๋กค์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ป์€ ์œ ์ผํ•œ ๊ฒƒ์€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์‹œ๊ฐ„ ๋‚ญ๋น„๋ผ๊ณ  ๊ฑฑ์ •ํ•˜์ง€๋งŒ C++์—์„œ WinUI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ด€๋ฆฌ๋˜๋Š” ๋Ÿฐํƒ€์ž„์„ ๋กœ๋“œํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๊ดœ์ฐฎ๋‹ค๋ฉด ํ˜„์žฌ ๊ด€๋ฆฌ๋˜๋Š” ๊ตฌํ˜„์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ WinRT ๋ฐ UWP ์•ฑ ๋ชจ๋ธ์— ๊ด€ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ, v3์—์„œ๋Š” WinUI์— ์™„์ „ํžˆ ์ ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์–ด๋Š ์ชฝ๋„ ์‹ค์ œ๋กœ WinUI์— ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@dotMorten -- ๋‚ด๊ฐ€ ๊ทธ ๋ฉ”์‹œ์ง€์— ์ถ”๊ฐ€ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์“ด ์ด์œ ๋Š” ๋ฌธ์ œ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์ด ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์Šฌํ”„๊ฒŒ๋„ ์ง€๊ธˆ์€ ์ถ”๊ฐ€ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์‹คํŒจํ–ˆ์œผ๋ฉฐ ์–ด์จŒ๋“  ์—ฌ์ „ํžˆ ์ดํ•ด๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ •๋ง ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํ”ผ๋“œ๋ฐฑ์„ ์ „ํ˜€ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์˜๋ฏธํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ดํ•ด๋˜๋”๋ผ๋„ ์ด์„ ์˜๋Š” ๊ฒƒ์ด ์ธ๊ฐ„์˜ ๋ณธ์„ฑ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜์œ ์†Œ์‹์„ ์ „ํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ฏ€๋กœ ์•„๋ฌด ๋ง๋„ ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฐ˜๋Œ€๋กœ ์ƒ๊ฐํ•˜๋ฉด์„œ ๊ทธ๋ƒฅ "๊ณต์†ํ•˜๊ฒŒ" ๋ฏธ์†Œ ์ง“๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

v3์—์„œ ์™„์ „ํžˆ ํ•ด๋ฐฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด v3 ๋ฐ”์ธ๋”ฉ ํ•ด์ œ๋Š” ๋™์ผํ•œ ์‹ค์ˆ˜์˜ ๋ฐ˜๋ณต์„ ๋ฐฉ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "๊ณ„ํš ์ง€์† ํŽธํ–ฅ"์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ํ™ˆํŽ˜์ด์ง€๋กœ ์ด๋™:
https://www.microsoft.com/en-us/
์ด์ œ Windows Phone์ด ํ‘œ์‹œ๋  ๋•Œ๊นŒ์ง€ ํ™ˆ ํŽ˜์ด์ง€๋ฅผ ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•ฉ๋‹ˆ๋‹ค. ์˜ค! ์ €๊ฒƒ ๋ด! ์šฐ๋ฆฌ๋Š” ํ™ˆ ํŽ˜์ด์ง€์˜ ๋์— ๋„๋‹ฌํ–ˆ๊ณ  Windows Phone์€ Microsoft ํ™ˆ ํŽ˜์ด์ง€์˜ ์–ด๋””์—๋„ ์–ธ๊ธ‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค! ์ด๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธ ํ•˜๋Š”๊ฐ€? ์ผ์–ด๋‚˜๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด UWP๊ฐ€ ์น˜๋ช…์ ์ธ ์‹คํŒจ๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, UWP์˜ ์‹คํŒจ๋กœ ์ด์–ด์ง„ ๋™์ผํ•œ ์‹ค์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์žฌ๋‚œ์œผ๋กœ๋ถ€ํ„ฐ ๊ตฌ์กฐํ•˜๊ณ  ๋ณต๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ๊ณ„ํš์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
WinUI์™€ DataGrid๊ฐ€ UWP์˜ ์‹คํŒจ์™€ ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ๊ณ„์† ๋ฐ˜๋ณตํ•œ๋‹ค๋ฉด ๊ด€๋ฆฌ ์‹ค์ˆ˜๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"2016๋…„ 5์›” Microsoft๋Š” ๋ชจ๋ฐ”์ผ ์‚ฌ์—…์„ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ... 2017๋…„ Microsoft ์ž„์›์ธ Joe Belfiore๋Š” ์‹œ์žฅ ์ ์œ ์œจ์˜ ์†์‹ค๊ณผ ์•ฑ ๊ฐœ๋ฐœ."
-- https://en.wikipedia.org/wiki/Microsoft_Mobile

Ana๋Š” wrt DataGrid์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด 5๊ฐ€์ง€ ์‚ฌํ•ญ์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์–ด๋–ค ์ ์— ๋Œ€ํ•ด ๋…ผํ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹น์‹ ์ด ์“ฐ๊ณ  ์žˆ๋Š” ๊ฒƒ์—์„œ ๋‚ด๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„์ธ ๊ฒƒ ๊ฐ™์•„์š”. UWP๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑ์‹œํ‚ค์ง€๋Š” ์•Š์ง€๋งŒ WinUI3๋Š” UWP ์•ฑ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์‹œํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„ UWP์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ๊ฑฐ๊ธฐ์— ์ž˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

DataGrid๋Š” ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ๊ณ„์†ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ธฐ์กด DataGrid์— ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์‹ค์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉฐ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? (์–ด๋–ค ์ด์œ ๋กœ C++๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ )

@dotMorten

Ana๋Š” wrt DataGrid์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด 5๊ฐ€์ง€ ์‚ฌํ•ญ์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์–ด๋–ค ์ ์— ๋Œ€ํ•ด ๋…ผํ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ๋ฉ”์‹œ์ง€์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ Ana๋ฅผ ์ธ์šฉํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ๋ฉ”์‹œ์ง€์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์ธ์šฉํ•œ Ana์˜ ๋ฉ”์‹œ์ง€์˜ ์ผ๋ถ€์— ๋Œ€ํ•ด ๋…ผํ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

WinUI3๋Š” UWP ์•ฑ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚ด ๋ฉ”์‹œ์ง€์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. Nuget ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” WinUI 3์€ UWP ๋ฐ Windows Phone์˜ ์‹คํŒจ์™€ Microsoft์˜ ์ˆ˜์‹ญ์–ต ๋‹ฌ๋Ÿฌ ์†์‹ค์„ ์ดˆ๋ž˜ํ•œ ๋™์ผํ•œ ๊ด€๋ฆฌ ์‹ค์ˆ˜๋ฅผ WinUI 3์ด ๊ณ„์†ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์งˆ๋ฌธ๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ?

์ด์ „ ๋ฉ”์‹œ์ง€ ์˜ ๋์— ์žˆ๋Š” 6๊ฐœ์˜ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ. ๋‘ ๋ฒˆ์งธ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ(์Šคํฌ๋ฆฝํŒ…)๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ WinUI ๋ฐ UWP์™€ ๊ด€๋ จ๋˜์ง€๋งŒ DataGrid์™€๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. DataGrid์— ๋Œ€ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ๋ฌป๋Š” ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋˜ํ•œ ์ด๋ ‡๊ฒŒ ์ผ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์–‘์˜ ๊ด€๋ฆฌ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋น„์ƒ์‚ฐ์ ์ธ ์˜ค๋ž˜๋œ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” "๋„ค์ดํ‹ฐ๋ธŒ" ์ฝ”๋“œ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ง„์ •ํ•œ ๋ฒ ํƒ€ ์ƒํƒœ์— ๋„๋‹ฌํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ง€์—ฐ์€ ์ด๋ฏธ ๋งค์šฐ ํฝ๋‹ˆ๋‹ค. ์ง€์—ฐ์„ ๋” ์•…ํ™”์‹œํ‚ค๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@anawishnoff ๋Š” ๋‹ค์Œ

๊ธฐ๋ณธ WinUI ์ปจํŠธ๋กค๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

"๊ธฐ๋ณธ WinUI ์ปจํŠธ๋กค๋กœ ์ „ํ™˜"์€ Wikipedia์— ์–ธ๊ธ‰๋œ "์‹œ์žฅ ์ ์œ ์œจ ์†์‹ค ๋ฐ ์•ฑ ๊ฐœ๋ฐœ ๋ถ€์กฑ"์œผ๋กœ ์ด์–ด์ง„ ๋™์ผํ•œ ์‹ค์ˆ˜ ์ค‘ ์ผ๋ถ€์˜ ์—ฐ์†/๋ฐ˜๋ณต์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

"2016๋…„ 5์›” Microsoft๋Š” ๋ชจ๋ฐ”์ผ ์‚ฌ์—…์„ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ... 2017๋…„ Microsoft ์ž„์›์ธ Joe Belfiore๋Š” ์‹œ์žฅ ์ ์œ ์œจ์˜ ์†์‹ค๊ณผ ์•ฑ ๊ฐœ๋ฐœ."
-- https://en.wikipedia.org/wiki/Microsoft_Mobile

์™œ DataGrid๋Š” Microsoft์˜ ๋ชจ๋ฐ”์ผ ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ํŒŒ๊ดดํ•œ ๋™์ผํ•œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@verelpode

WinUI 3๋Š” UWP ๋ฐ Windows Phone์˜ ์‹คํŒจ์™€ Microsoft์˜ ์ˆ˜์‹ญ์–ต ๋‹ฌ๋Ÿฌ ์†์‹ค๋กœ ์ด์–ด์ง„ ๋™์ผํ•œ ๊ด€๋ฆฌ ์‹ค์ˆ˜๋ฅผ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์—์„œ ์ผํ•˜์ง€ ์•Š๋Š”๋ฐ ์™œ WinUI๊ฐ€ ๊ด€๋ฆฌ ์‹ค์ˆ˜๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
WinUI๊ฐ€ ์˜คํ”ˆ ์†Œ์Šค๋กœ ์ œ๊ณต๋˜๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋Œ€ํ™”์™€ ์˜์‚ฌ ๊ฒฐ์ •์— ๊ธฐ์—ฌํ•œ๋‹ค๋Š” ๋ฐ”๋กœ ๊ทธ ์‚ฌ์‹ค์ด ์‹ค์ œ๋กœ WinUI๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ •์˜ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ ์‹ค์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
DataGrid๊ฐ€ ๋ชจ๋ฐ”์ผ๊ณผ ๋™์ผํ•œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ๊ณ„์† ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ํ”ผ์น˜์—์„œ ๋ชจ๋ฐ”์ผ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์„ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด ๋ฌธ์ œ๊ฐ€ ๋…ผ์˜ ์ค‘์ธ ๋‚ด์šฉ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ง์ ‘ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
WinUI์— ์ž˜๋ชป๋œ ๊ด€๋ฆฌ ๋‹จ๊ณ„๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์šฐ๋ ค ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์ด DataGrid ์ปจํŠธ๋กค๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@verelpode ์—ฌ๊ธฐ์—์„œ ์ฃผ์ œ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค. WinUI ๋˜๋Š” UWP์— ๋Œ€ํ•ด ์ „๋ฐ˜์ ์œผ๋กœ ์šฐ๋ ค ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ํ† ๋ก  ์ฃผ์ œ๋ฅผ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์ €์—๊ฒŒ ์ง์ ‘ ์—ฐ๋ฝํ•˜์‹ญ์‹œ์˜ค(์ด๋ฉ”์ผ ๋˜๋Š” ํŠธ์œ„ํ„ฐ DM). ๋˜๋Š” #717 ๋˜๋Š” #1531๊ณผ ๊ฐ™์€ ๊ธฐ์กด ์ฃผ์ œ์— ๋Œ€ํ•ด ํ† ๋ก ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DataGrid๊ฐ€ C++๋กœ ๋‹ค์‹œ ์ž‘์„ฑ๋˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์šฐ๋ ค๋ฅผ ๊ณต์œ ํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ์›๋ž˜ ์ œ์•ˆ์—์„œ๋Š” ์ด์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. @anawishnoff ๋Š” DataGrid ๊ธฐ๋Šฅ ์„ธํŠธ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ˆ˜์ง‘ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„ ์ธก๋ฉด์—์„œ C#์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ด๋ผ๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(WinRT ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ˆ˜ํ–‰ํ•œ ๊ฒฝ์šฐ C++์—์„œ ์—ฌ์ „ํžˆ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ).

@jevansaks -- ์ œ ํ”ผ๋“œ๋ฐฑ์€ ์ฃผ์ œ์˜€์ง€๋งŒ ๋‚˜์œ ์†Œ์‹์„ ์ „ํ•˜๋Š” ๋ฉ”์‹ ์ €๋ฅผ ์˜๋Š” ๊ฒƒ์€ ์ธ๊ฐ„์˜ ๋ณธ์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ๋ฐ˜์‘์€ ์ €๋ฅผ ์Šฌํ”„๊ณ  ์‹ค๋ง์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์ •์งํ•˜๊ณ  ์ง์ ‘์ ์ด๋ฉฐ ์ธ์ •ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๊ณ ํ†ต์Šค๋Ÿฌ์šด ๊ณ ํ†ต์Šค๋Ÿฌ์šด ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(WinRT์˜ ์น˜๋ช…์ ์ธ ์‹คํŒจ๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ๊ฐ์ •์„ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค๋ฏ€๋กœ ์ง€์šฐ๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ญ์ œํ•˜๊ณ  ์žฌํ•ด๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ผํ•œ ์ด์ „ ์›๋ž˜ WinRT ๊ณ„ํš์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ณ„์†ํ•ด์„œ ์ •์งํ•˜๊ณ  ์ง์ ‘์ ์œผ๋กœ ๋งํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์„ ์งœ์ฆ๋‚˜๊ฒŒ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ† ๋ก ์„ ๋๋‚ด๊ณ  DataGrid์˜ ๊ฐœ๋ฐœ์— ๋” ์ด์ƒ ์ฐธ์—ฌํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@verelpode ์—ฌ๊ธฐ์—์„œ "๋‚˜์œ ์†Œ์‹์„ ์ „ํ•˜๋Š” ๋ฉ”์‹ ์ €๋ฅผ ์œ" ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์Šต๋‹ˆ๋‹ค. @jevansaks ๋Š” ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ UWP/WinUI/WinRT์— ๋Œ€ํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ์šฐ๋ ค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด

๋‹น์‹ ์ด ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๋Š” WinUI ํŒ€๊ณผ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ชจ๋‘๊ฐ€ ๊ด€๋ จ๋œ ํฅ๋ฏธ๋กœ์šด ํ† ๋ก ์˜ ๊ธฐ์ดˆ๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ํŠน์ • ๋ฌธ์ œ๋Š” ๊ทธ๋Ÿฌํ•œ ํ† ๋ก ์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@anawishnoff
Microsoft Pivot Viewer Control์ด html์ด ์•„๋‹ˆ๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋ด์ฃผ์„ธ์š”. ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์šฐ๋ฆฌ๊ฐ€ ํ•œ๋•Œ ํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. Silverlight์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://www.microsoft.com/silverlight/pivotviewer/default# Deep Zoom ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. WinUI 3.0์— Deep Zoom ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ •๋ง ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์‹ค์ œ๋กœ DataGrid๊ฐ€ ์•„๋‹ˆ๋ผ Data Display ์ปจํŠธ๋กค์ž…๋‹ˆ๋‹ค. Deep Zoom๊ณผ ๊ฐ™์€ WPF ์ดˆ์ฐฝ๊ธฐ๋ถ€ํ„ฐ ๋งŽ์€ "ํฌ๊ธฐ๋œ" ์•„์ด๋””์–ด๊ฐ€ ์žˆ์ง€๋งŒ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ WinUI 3.0์—์„œ ๋‹ค์‹œ ์‚ด์•„๋‚˜๊ฒŒ ํ•˜๋Š” ํ”„๋กœ๋•์…˜ WPF ์ปจํŠธ๋กค๋กœ ๋งŒ๋“ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์  ์žฅ WPF ๋ฐ•์‚ฌ๋ฅผ ์ง€ํ•˜์‹ค์—์„œ ๊บผ๋‚ด์„œ ๋‹ค์‹œ ๊ฒŒ์‹œํ•˜๊ฒŒ ํ•˜์„ธ์š”!!! ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฐ€ ๋‹ค์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์šด๋™์„ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. WPF ๋ฐ•์‚ฌ๋ฅผ ๋Œ๋ ค์ฃผ์„ธ์š”!!!!! ์–ด๋”” ๊ฐ”๋‹ค? ์œˆ์œ ์ด ๋ฐ•์‚ฌ!!!

@PaulMontgomerySP ๋Š” ํ”ผ๋ฒ— ์ œ์–ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/windows-toolkit/WindowsCommunityToolkit/issues/770 ์—์„œ Windows Community Toolkit์—์„œ ์ด์— ๋Œ€ํ•œ ์ด์ „ ํ† ๋ก ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

ํ‚ค๋ณด๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฐ ํ–‰์— ๋Œ€ํ•ด ์„ ํƒ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์„ ํƒ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ๋งˆ์šฐ์Šค ํด๋ฆญ์ด๋‚˜ ์…€ ํƒญ์—๋งŒ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ ํƒ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๋Š” ํด๋ฆญ ๋ฐ ํ‚ค๋ณด๋“œ ๋ชจ๋‘์— ๋Œ€ํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํด๋ฆญ๋งŒ์„ ์œ„ํ•œ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Going-Gone ๊ทธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์ด์ ์„ ์•Œ์•„์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋˜ํ•œ ํƒญ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

๋ฐฉ๊ธˆ UWP Toolkit์˜ DataGrid์— ๋ถ€๋”ชํžŒ ํ•œ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์€ DataGridTemplateColumn ์— CellTemplate์ด ์žˆ์ง€๋งŒ CellTemplateSelector ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค( CellEditingTemplate ๋Œ€ํ•ด ๋™์ผํ•œ ๋ˆ„๋ฝ). ์…€๋ ‰ํ„ฐ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์…€์˜ UI๋ฅผ ๋ฐ์ดํ„ฐ์— ์ ์šฉํ•˜๋Š” ์ž‘์—…์„ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์…€ ์•„๋ž˜์— ์žˆ๋Š” ์ถ”๊ฐ€ ์ˆ˜์ค€์˜ UI ์ปจํŠธ๋กค๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์—ฐ์†์ ์ธ ์ˆœ์„œ๋กœ ํ–‰์„ ์„ ํƒํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ–‰์„ ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/duke7553/files-uwp/issues/276#issue -520060100

๊ทธ๋ฆฌ๋“œ๊ฐ€ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž์ฃผ ์š”์ฒญํ•˜๋Š” ํŠน์ • ์ˆœ์„œ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

1. ํ•„ํ„ฐ๋ฅผ ์ €์žฅ, ๋กœ๋“œ ๋ฐ ๋นŒ๋“œํ•˜๋Š” ๊ธฐ๋Šฅ. ์˜ˆ๋ฅผ ๋“ค์–ด linq ํ‘œํ˜„์‹์— ๋Œ€ํ•œ ํ•„ํ„ฐ, SQL ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ํ•„ํ„ฐ, ํ‘œํ˜„์‹ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ํ•„ํ„ฐ ๋ฐ ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ์˜ˆ - https://querybuilder.js.org/demo.html

  1. ๊ณ ์† ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ธฐ๋Šฅ, ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ 1ms ๋ฏธ๋งŒ ์žฌ์ƒ ๋นˆ๋„์™€ 1๋ฐฑ๋งŒ ๊ฐœ ์ด์ƒ์˜ ํ–‰์€ ์„ฑ๋Šฅ ๊ณ ๋ ค ์‚ฌํ•ญ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  2. ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ธฐ๋Šฅ, ์˜ˆ: i. ๋†’์€/๋‚ฎ์€ ์ •๋ ฌ, ii. ๋‚ฎ์€/๋†’์€ ์ •๋ ฌ ๋ฐ iii. ์ข…๋ฅ˜๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋‚˜. ๋‚ฎ์€/๋†’์€ ์ •๋ ฌ, ii. ๋†’์Œ/๋‚ฎ์Œ ์ •๋ ฌ ๋ฐ iii. ์ข…๋ฅ˜๊ฐ€ ์—†๋‹ค
  3. ์—‘์…€๊ณผ ๊ฐ™์€ ํ•„ํ„ฐ๋ง
  4. ์…€์— CSS ์„œ์‹์„ ์ ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ, ์กฐ๊ฑด๋ถ€ ์„œ์‹
  5. ํ•„ํ„ฐ, ์—ด ๋„ˆ๋น„, ์ •๋ ฌ ๋“ฑ๊ณผ โ€‹โ€‹๊ฐ™์€ ๊ทธ๋ฆฌ๋“œ ์„ค์ •์„ ์‰ฝ๊ฒŒ ์ €์žฅ/๋กœ๋“œํ•˜๋Š” ๊ธฐ๋Šฅ
  6. ์ž‘๋™ํ•˜๋Š” ์Šคํฌ๋กค, ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ํ›„ ์žฌ์„ค์ •๋˜์ง€ ์•Š์Œ, ๋ถ€๋“œ๋Ÿฝ๊ฒŒ.
  7. ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์ด๋ฒคํŠธ์—๋Š” ๊ฐœ๋ณ„ ๊ฐœ์ฒด๊ฐ€ ์•„๋‹Œ ๋ฒ”์œ„๋ฅผ ๋กœ๋“œํ•œ ํ›„ ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ObservableCollection์—๋Š” ์ถ”๊ฐ€๋œ ๊ฐ ๊ฐœ๋ณ„ ๊ฐœ์ฒด์— ๋Œ€ํ•ด INotifyPropertyChange ๋ฐœ์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  8. ๋ฐ์ดํ„ฐ ๋กœ๋“œ/๋กœ๋“œ, ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์‹œ์ž‘, ๋ฐ์ดํ„ฐ ๋กœ๋“œ, ํŠนํžˆ ๋น„๋™๊ธฐ ๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ๋กœ๋“œ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์ด๋ฒคํŠธ.
  9. ๊ทธ๋ฆฌ๋“œ๋Š” ์ข…์ข… ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ, ๋ฒ”์œ„ ์„ ํƒ, ๊ต์ฐจ ํ•„ํ„ฐ(์˜ˆ: https://github.com/dc-js/dc.js), ์ฐจํŠธ, ํ”ผ๋ฒ— ํ…Œ์ด๋ธ” ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ปจํŠธ๋กค์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  10. ์˜์ˆซ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋งˆํŠธ ์ •๋ ฌ(์˜ˆ: ์ •๋ ฌ ์ˆœ์„œ ABC11, ABC111, ABC12 ๋Œ€์‹  ABC11, ABC12, ABC111)
  11. ๋ฌด์ œํ•œ ์ˆ˜์ค€์˜ ๊ณ„์ธต์  ๊ทธ๋ฆฌ๋“œ(์˜ˆ: https://docs.telerik.com/devtools/wpf/controls/radgridview/hierarchical-gridview/hierachy-overview)

์œ ์šฉํ•œ ๋ฆฌ์†Œ์Šค: - ๋” ๋‚˜์€ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” ๋””์ž์ธ
https://news.ycombinator.com/item?id=21460966
https://uxdesign.cc/design-better-data-tables-4ecc99d23356

ํ—ค๋”์—์„œ ์ง์ ‘ ์—ด ๋„ˆ๋น„์— ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. WPF์—์„œ๋Š” ์ด ๊ฒฝ์šฐ BindingProxy ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋” ์‰ฝ๊ฒŒ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™œ์„ฑ ํ–‰์˜ ํŽธ๋ฆฌํ•œ ๋™์  ํฌ๊ธฐ ์กฐ์ •.
ํŽธ์ง‘ ๋ชจ๋“œ์—์„œ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด๋ฅผ ์™„์ „ํžˆ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

Telerik์—์„œ์™€ ๊ฐ™์ด CellDecorationStyleSelector๋ฅผ ์ง€์›ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ ‘๊ทผ์„ฑ!
๋ฌธ์„œํ™”๋˜๋„๋ก ์–ธ๊ธ‰ํ•˜์ง€๋งŒ ์ด ์ปจํŠธ๋กค์€ ์™„์ „ํžˆ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ ํˆดํ‚ท ๋ฒ„์ „์€ https://github.com/windows-toolkit/WindowsCommunityToolkit/issues/3400 & https://github.com/windows-toolkit/WindowsCommunityToolkit/issues/3079 ์˜์—ญ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ Telerik RadDataGrid์—๋Š” ๋ช‡ ๊ฐ€์ง€ ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์ง€๋งŒ ์ ‘๊ทผ์„ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค .

D&I์— ๋Œ€ํ•œ Microsoft์˜ ๋Œ€๋Œ€์ ์ธ ์ถ”์ง„์œผ๋กœ ์ธํ•ด ๋ชจ๋“  ์ปจํŠธ๋กค์— ์™„์ „ํžˆ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋ชจ๋“  ๊ณณ์—์„œ ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ด๊ฒƒ์€ ์ด๋ฏธ ๊ฐ€๋Šฅํ•˜๊ณ  ๋‚˜๋Š” ์•„์ง ๊ทธ๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค... ํ•˜์ง€๋งŒ ์–ด๋–ป๊ฒŒ: ์‚ฌ์šฉ์ž ์ •์˜ ํ–‰ ๋˜๋Š” ์…€ ์Šคํƒ€์ผ ์ง€์ •?

ํŠน์ • ํ–‰์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๊ณ  ๋ฐฐ๊ฒฝ ๋ฐ ํ…์ŠคํŠธ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์€ ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

WCT UWP DataGrid์™€ ๋น„๊ตํ•˜์—ฌ:
1) ์„ฑ๋Šฅ
2) ๋” ๋งŽ์€ ๊ธฐ๋ณธ ์ œ๊ณต ์—ด ์œ ํ˜•(ํ…œํ”Œ๋ฆฟ ์—ด๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋” ์ข‹๋‹ค๊ณ  ๊ฐ€์ •)
3) ์…€๋‹น ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ํ›„ํฌ ๊ธฐ๋Šฅ
4) Cell๋ณ„ ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ
5) (3)์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ ์ค‘ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์—๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
6) ์„ฑ๋Šฅ

WinUI DataGrid๊ฐ€ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ DataGrid ๋‚ด๋ถ€์—์„œ ์ธ๋ผ์ธ/์ง์ ‘์ ์œผ๋กœ ์…€ ๊ฐ’์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ํฌ๊ธฐํ•œ๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด์˜๋ฅผ ์ œ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๊นŒ?

VB6์„ ๊ธฐ์–ตํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? VB6 DataGrid๋Š” ์ฆ‰์‹œ ํŽธ์ง‘, ์‚ญ์ œ ๋ฐ AddNew๋ฅผ ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋Š” ๋ชฉ๋ก ๋์— ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š” ๋นˆ ํ–‰์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ–‰์„ ์™„์„ฑํ•˜๋ฉด ๋‹ค๋ฅธ ๋นˆ ํ–‰์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

DataGrid์—๋Š” ๋ฐ์ดํ„ฐ ์ž…๋ ฅ์„ ์ง€์›ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋„๊ธฐ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

VB6 ์•ฑ์„ UWP๋กœ ์ด์‹ํ•  ๋•Œ ์ถ”๊ฐ€/ํŽธ์ง‘/์‚ญ์ œ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฒด ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๊ธฐ์—ฌํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์€ WPF/Xaml ์‚ฌ๋žŒ๋“ค์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ xaml ์‚ฌ๋žŒ์ด ์•„๋‹Œ ์‚ฌ๋žŒ์—๊ฒŒ์„œ 2์„ผํŠธ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์†Œํ”„ํŠธ์›จ์–ด์—์„œ DataGrid ์ปจํŠธ๋กค์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŽธ์ง‘ ์žฅ์†Œ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค! ๋‚ด ์†Œ์›/๊ณ ํ†ต ์‚ฌํ•ญ ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํŽธ์ง‘ ๋ชจ๋“œ์—์„œ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ.
  2. ์—ด ์ž๋™ ํฌ๊ธฐ ์กฐ์ • ์‹œ ๋” ๋‚˜์€ ์„ฑ๋Šฅ๊ณผ ๋” ๋งŽ์€ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ํฌ๊ธฐ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ด ํฌ๊ธฐ๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฐฑ๋งŒ ํ–‰์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ธก์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.
  3. ํŽธ์ง‘ํ•  ๋•Œ ํŽธ์ง‘์„ ์ข…๋ฃŒํ•˜์ง€ ์•Š๊ณ  ํŽธ์ง‘ ์ค‘์ธ ๋ฐ์ดํ„ฐ์—(๋˜๋Š” ์ด์™€ ํ•จ๊ป˜) ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ์ปจํŠธ๋กค/๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ #1์ด ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ ๋œ ํ•„์š”ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.)
  4. DataError ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ˜„์žฌ ๋ฐฉ์‹์€ ๋Œ€๋žต์ ์ž…๋‹ˆ๋‹ค. (์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ๋ง์”€๋“œ๋ฆฌ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณผ๊ฑฐ์— ์—ฌ๋Ÿฌ ๋ฒˆ ์ €๋ฅผ ์•„ํ”„๊ฒŒ ํ–ˆ๋˜ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)
  5. ๋‚ด์žฅ๋œ ์ž๋™ ์Šคํฌ๋กค ๊ธฐ๋Šฅ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค: http://stackoverflow.com/questions/2567809/how-to-autoscroll-a-datagridview-during-drag-and-drop
  6. ๋ฐ์ดํ„ฐ๊ฐ€ "๋”ํ‹ฐ"์ธ ๊ฒฝ์šฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” "์›Œํ„ฐ๋งˆํฌ"๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ(DataGridView์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ์ถ”๊ฐ€ ๊ฐœ์„  ์‚ฌํ•ญ์€ BetterGrid ๋ฅผ ์ฐธ์กฐ
  7. ํ•„์ˆ˜ "ํ‚ค" ์…€์ด ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ–‰์„ ํฌ๊ธฐํ•˜๋Š” ๊ธฐ๋Šฅ(๊ฒ€์ฆ ์˜ค๋ฅ˜ ์—†์ด).
  8. ์‚ฌ์šฉ์ž๊ฐ€ ์ถ”๊ฐ€ํ•œ ํ–‰์— ๋Œ€ํ•ด ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ๊ธฐ๋Šฅ(๋นจ๊ฐ„์ƒ‰ X ๋Œ€์‹ ). ์ฐธ์กฐ: https://stackoverflow.com/questions/937919/datagridviewimagecolumn-red-x
  9. ์ฒดํฌ๋ฐ•์Šค ์—ด์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ฆ‰์‹œ ์ปค๋ฐ‹๋˜๋„๋ก ํ—ˆ์šฉ: https://stackoverflow.com/questions/11843488/how-to-detect-datagridview-checkbox-event-change

์•ŒํŒŒ๋Š” ์–ธ์ œ ์ถœ์‹œ๋  ์˜ˆ์ •์ธ๊ฐ€์š”? ๊ธฐ๋ถ€๊ธˆ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ํŠนํžˆ ๊ฐ€์ƒํ™” ๊ธฐ๋Šฅ์„ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์— ๋งค์šฐ ๋Šฆ์€ ์ž…๋ ฅ์„ ๋„ฃ์–ด ์ฃ„์†กํ•˜์ง€๋งŒ ์ €์—๊ฒŒ๋Š” "์ƒˆ๋กœ์šด" ๊ฒƒ์ž…๋‹ˆ๋‹ค ;)
_์ปจํŠธ๋กค์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์กฐ๊ธˆ ๋” ์•Œ์•„๋ณธ ํ›„ ์ˆ˜์ •_

ํด๋ผ์šฐ๋“œ ๋“œ๋ผ์ด๋ธŒ์šฉ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ™์€ ํƒ์ƒ‰๊ธฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด DataGrid์™€ ํ•จ๊ป˜ ์ž‘์—…ํ•˜๋ฉด์„œ ํƒญ๋˜๋Š” ํ–‰๊ณผ ์…€์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด "ํ•ด์•ผ"ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค(IMHO).

๋‚ด ์•ฑ ๋””์ž์ธ์—์„œ ํ–‰์€ ํŒŒ์ผ ๋˜๋Š” ํด๋”(DriveItems)๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ƒ์„ธ ๋ณด๊ธฐ๋Š” ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

ํด๋” ํ•ญ๋ชฉ์„ ํด๋ฆญํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ํ•ด๋‹น ํ•ญ๋ชฉ ๋ชฉ๋ก์„ ๋งŒ๋“ค์–ด ๋“œ๋ผ์ด๋ธŒ ์ „์ฒด๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

image

์˜ˆ๋ฅผ ๋“ค์–ด ํ•ญ๋ชฉ์˜ "์ƒ์œ„" ์—ด ํ•ญ๋ชฉ(์—ฌ๊ธฐ์—์„œ /drive/root:/Documents/Vital%20Documents ํƒญํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•ด๋‹น ํด๋”๋กœ ์žฌ์„ค์ •๋˜๊ณ  ๊ฑฐ๊ธฐ์— ํŒŒ์ผ์ด ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

์…€์— ๋Œ€ํ•ด ํด๋ฆญ๋œ ์ด๋ฒคํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด๋‹น ์ด๋ฒคํŠธ์—๋Š” ํƒญ๋œ ์…€(ํ–‰, ์˜ˆ, ์—ด ์•„๋‹˜)์„ ๊ฒฐ์ •ํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉฐ ํ˜„์žฌ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•˜๋ฉด ์…€ ํƒญ ๋™์ž‘๊ณผ ์ž๋™์œผ๋กœ ์—ด๋ฆฌ๋Š” ์„ธ๋ถ€ ์ •๋ณด ๋™์ž‘์„ ๋ชจ๋‘ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋ฅผ ํ—ˆ์šฉํ•˜๋Š” "ํ•ดํ‚น"์ด๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์—ฌ์ „ํžˆ ์กฐ์‚ฌํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋””์ž์ด๋„ˆ๊ฐ€ ์ปจํŠธ๋กค์˜ ์ •์ƒ์ ์ธ ๊ธฐ๋Šฅ์„ ๋ฌด์‹œํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ ํŠนํžˆ ๋ฌธ์„œํ™”๋œ ๋™์ž‘์ด ์•„๋‹ˆ๋ผ ์ปจํŠธ๋กค ๋™์ž‘์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋””์ž์ธ์ด ์†์ƒ๋  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“ , ๋˜ํ•œ ํฌํ•จ๋˜์–ด์•ผ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ๋Š” ํ˜„์žฌ CurrentItem์œผ๋กœ DriveItem๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผํ•จ์œผ๋กœ์จ ๋‚ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๋งํ–ˆ๋‹ค CurrentColumn ์ „์ฒด๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  DataGridColumn ๋‚ด์—์„œ ํด๋ฆญ ๋œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์—ด ์ด๋ฆ„์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด๋ฒคํŠธ์—์„œ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” CurrentColumn ๊ฐœ์ฒด๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์ง€๋งŒ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์„ธ๋ถ€ ์ •๋ณด ๋™์ž‘์— ๋Œ€ํ•œ ๋ณด๋‹ค ์—„๊ฒฉํ•œ ์ œ์–ด๋Š” ํ–‰์˜ ์•„๋ฌด ๊ณณ์ด๋‚˜ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ํ™•์žฅ๋˜๋Š” ๋Œ€์‹  ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ํŠน์ • ์—ด์„ ํด๋ฆญํ•  ๋•Œ๋งŒ ์ž๋™ ํ™•์žฅ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DataGridColumn ๊ฐœ์ฒด์˜ ๊ธฐ๋ณธ ํด๋ž˜์Šค์—๋Š” ๊ฐ ์—ด์— ๋Œ€ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ true๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ExpandDetails ์†์„ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŠน์ • ์—ด์„ ํด๋ฆญํ•˜๋ฉด ํ–‰์ด ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ์†์„ฑ์ด false์ธ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด ๋””์ž์ธ์—์„œ ์ฒซ ๋ฒˆ์งธ ์—ด์€ ํŒŒ์ผ ๋˜๋Š” ํด๋”, ์ด๋ฏธ์ง€ ๋˜๋Š” ์‚ฌ์ง„, ์˜ค๋””์˜ค ๋“ฑ๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์—ด์„ ์ž๋™ ํ™•์žฅ ๋™์ž‘์„ ์ผ์œผํ‚ค๋Š” ์œ ์ผํ•œ ์—ด๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ตฌ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฒฝ๋กœ ์—ด์„ ํด๋ฆญํ•˜๋ฉด ์œ„์—์„œ ์„ค๋ช…ํ•œ "ํ•ด๋‹น ๊ฒฝ๋กœ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ" ๋™์ž‘์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •๋ ฌ์˜ ๊ฒฝ์šฐ ๋””์ž์ด๋„ˆ๊ฐ€ ๋‹ค๋‹จ๊ณ„ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถฉ๋ถ„ํ•œ ์ œ์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ค‘์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ปจํŠธ๋กค์ด ์ด๋ฒคํŠธ ๋ฐ ์ฝœ๋ฐฑ ํ›„ํ‚น/์žฌ์ •์˜๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์กฐ์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ฐ„๋‹จํ•ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๊ฒƒ์„ ์ž˜ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ (๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋„) ์‚ฌ์šฉ์ž๊ฐ€ DataGrid ์œ„์— ์Šค์Šค๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณต์žกํ•œ ๋™์ž‘์„ ๋งŽ์ด ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ์‹œ๋‹ค. DataGrid์—์„œ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์„ ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ํ•„ํ„ฐ ๋˜๋Š” ์ •๋ ฌ ๋“ฑ์„ ์™ธ๋ถ€์— ์ €์žฅํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ์ปจํŠธ๋กค์„ Excel ๋ณต์ œ๋ณธ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค.

-๊ณ ๋งˆ์›Œ, ์ž˜ํ–ˆ์–ด!
-์ด์žํ˜•

๊ณ ์ • ๊ทธ๋ฃน: ํฐ ๊ทธ๋ฃน์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ ๋ณด๊ณ  ์žˆ๋Š” ๊ทธ๋ฃน(๋˜๋Š” ๊ทธ๋ฃน, ์ฆ‰, ์ด๋™ ๊ฒฝ๋กœ)์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทธ๋ฃนํ™”๋œ ๋ชฉ๋ก ๋ณด๊ธฐ, ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ ๋ฐ ํŠธ๋ฆฌ ๋ณด๊ธฐ์™€ ๊ฐ™์€ ๋ชจ๋“  ๊ณ„์ธต์  ๋ชฉ๋ก ๊ธฐ๋ฐ˜ ๋ณด๊ธฐ์— ํ•„์ˆ˜์ ์ธ ์‚ฌ์šฉ์„ฑ ๊ธฐ๋Šฅ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ƒˆ WinUI ItemsRepeater ์ปจํŠธ๋กค ์œ„์— ์ƒˆ DataGrid ์ปจํŠธ๋กค์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์ปจํŠธ๋กค์€ ItemsSource๋ฅผ ๊ฐœ์ฒด๋กœ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
Object ItemsSource { get; set; };

@RBrid ~1๋…„ ํ›„์— ๋‹ค์‹œ ๋Œ์•„์˜ต๋‹ˆ๋‹ค. ๋‚˜๋Š” ItemsRepeater์— ItemsSource ๊ฐœ์ฒด๊ฐ€ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๊ฐ€์ƒํ™”๋œ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์ž‘์—…์— ํ•„์š”ํ•œ ๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ œ๊ณต ์ง€์›์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

  • ISupportIncrementalLoading
  • IItemsRangeInfo
  • ISelectionInfo

- C++์—์„œ DataGrid๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก MVP๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰