Avalonia UserControl ์ ‘๊ทผ ๋ฌธ์ œ

์•ˆ๋…•ํ•˜์„ธ์š”. ํ•˜๋‚˜์˜ Window์— UserControl์ด ๋‘๊ฐœ ์ผ๋•Œ UserControl๋ผ๋ฆฌ ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›์•„์•ผ ํ•˜๋Š”๋ฐ ๊ณ„์† ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

image

OperateRate๊ฐ€ ์˜ˆ์ œ๋ฌธ์˜ UserControlA์ž…๋‹ˆ๋‹ค.

๊ฐ’์„ ๊ฐ•์ œ๋กœ ์ ์šฉํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๊ฐ’์ด ๋„˜์–ด๊ฐ€๋Š”๋ฐ ์ด๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์„œ ๋„˜๊ธธ ์ˆ˜ ๊ฐ€ ์—†๋Š”๊ฑด์ง€์š”??

UserControlA - behind

public UserControlA : UserControl
{
 public static readonly StyledProperty<int> stopSecondsProperty = AvaloniaProperty.Register<UserControlA, int>(nameof(StopSeconds), 0, defaultBindingMode: BindingMode.TwoWay);

public int StopSeconds
{
    get => GetValue(stopSecondsProperty);
    set => SetValue(stopSecondsProperty , value);

}


UserControlB - behind

public UserControlB : UserControl
{
 public static readonly StyledProperty<int> stopProperty = AvaloniaProperty.Register<UserControlB, int>(nameof(StopSecond), 0 ,defaultBindingMode: BindingMode.TwoWay );

 public int StopSecond
 {
     get => GetValue(stopProperty);
     set => SetValue(stopProperty, value);
 }

MainWindow - xml
... ์ค‘๋žต ..
  <controls:UserControlB Name="UserB"/>
  <controls:UserControlA StopSeconds="{Binding #UserB.StopSecond}"/>

<!-- ์œ„ ์œ ์ €์ปจํŠธ๋กคA์— ๋ฐ”์ธ๋”ฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ. ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ , ๋ถ€๋ชจWindow์˜ Element๋กœ ์ ‘๊ทผํ•ด์„œ ๋ฐ”์ธ๋”ฉํ•ด๋„ ์ด๋ฏธ์ง€์˜ ์—๋Ÿฌ๋ฐœ์ƒ -->				
			   
			
	

์˜ฌ๋ ค์ฃผ์‹  ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์—†์–ด ๋ณด์ด๋Š”๋ฐ ํ˜น์‹œ ์›๋ณธ ์ฝ”๋“œ์—์„œ ์‹ค์ˆ˜ํ•˜์‹  ๊ฒŒ ์•„๋‹๊นŒ์š”?

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

๋ฐฉ๊ธˆ ๋‹ค์‹œ ๋ณด๋‹ค๊ฐ€ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค ใ… ใ…  ์•„๋ฌด๊ฒƒ๋„ ์•„๋‹Œ๊ฑฐ์— ํ•˜๋ฃจ์ข…์ผ ์‚ฝ์งˆํ–ˆ์Šต๋‹ˆ๋‹ค.
์•„๋ฐœ๋กœ๋‹ˆ์•„ ์ž์ฒด์˜ ๋ฌธ์ œ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์œผ๋‚˜ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๊พธ๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ๊ฐ’์ด ์˜ฌ๋ผ์˜ต๋‹ˆ๋‹ค.

<controls:UserControlB Name=โ€œUserBโ€/>
<controls:UserControlA StopSeconds=โ€œ{Binding #UserB.StopSecond}โ€/>

์ด ์•„๋‹ˆ๋ผ

<controls:UserControlB Name=โ€œUserBโ€ StopSecond=โ€œ{Binding #UserA.StopSeconds}โ€/>
<controls:UserControlA Name=โ€œUserAโ€ />

1๊ฐœ์˜ ์ข‹์•„์š”

StopSeconds StopSecond
axaml์ชฝ์— ๋‘ ์†์„ฑ ์ด๋ฆ„์ด ๋‹ค๋ฅธ๋ฐโ€ฆ ํ˜น์‹œ ์ด๊ฒƒ๋•Œ๋ฌธ์ดโ€ฆ์•„๋‹Œ์ง€โ€ฆ

1๊ฐœ์˜ ์ข‹์•„์š”

์•„ ์˜ˆ์ œ๋งŒ ๋˜๊ณ  ์›์†Œ์Šค๋Š” ์•ˆ๋˜๋„ค์š” ใ…Žใ…Ž;;; ๋‹ค๋ฅธ ์›์ธ์ด ์žˆ๋‚˜๋ด…๋‹ˆ๋‹ค ใ… ใ… 

1๊ฐœ์˜ ์ข‹์•„์š”

์•„, ์›์ธ์„ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์‹คํ–‰ํ•ด๋ณด์ง€ ์•Š๊ณ  ์ถ”์ธก์œผ๋กœ ๋‹ต๋ณ€๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. :sweat_smile:

์˜ฌ๋ ค์ฃผ์‹  ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต๋ถ™ํ•ด๋ณด๋‹ˆ ์˜ค๋ฅ˜๊ฐ€ ์žฌํ˜„๋˜์—ˆ๋Š”๋ฐ์š”.

WPF์˜ Dependency Property์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Avalonia์˜ Styled Property๋ฅผ ์ •์˜ํ•  ๋•Œ๋„ CLR ์†์„ฑ ์ด๋ฆ„ + Property suffix ๊ทœ์น™์„ ์ง€์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์†์„ฑ ์ด๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[์†์„ฑ์ด๋ฆ„]Property

๊ด€๋ จ ๊ณต์‹ ๋ฌธ์„œ: Defining Properties | Avalonia Docs

ํ˜„์žฌ UserControlA์—์„œ๋Š” stopSecondsProperty๋กœ ์„ ์–ธํ•˜์…จ๊ณ ,
UserControlB์—์„œ๋Š” stopProperty๋กœ ์„ ์–ธํ•˜์…จ๊ธฐ ๋•Œ๋ฌธ์—,
UserControlB์˜ ๊ฒฝ์šฐ ๋ฐ”์ธ๋”ฉ ๋Œ€์ƒ ์†์„ฑ์„ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(์žฌ๋ฏธ์žˆ๋Š” ์ ์€, stopSecondsProperty์ฒ˜๋Ÿผ CamelCase๋กœ ์ž‘์„ฑํ•œ ์ด๋ฆ„์—์„œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

์•„๋ž˜์™€ ๊ฐ™์ด ์†์„ฑ ์ด๋ฆ„์„ ๋งž์ถฐ์ฃผ์‹œ๋ฉด ์ž˜ ๋™์ž‘ํ•˜์‹œ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public class UserControlA : UserControl
{
	public static readonly StyledProperty<int> StopSecondsProperty = AvaloniaProperty.Register<UserControlA, int>(nameof(StopSeconds), 0, defaultBindingMode: BindingMode.TwoWay);

	public int StopSeconds
	{
		get => GetValue(StopSecondsProperty);
		set => SetValue(StopSecondsProperty, value);

	}
}

public class UserControlB : UserControl
{
	public static readonly StyledProperty<int> StopSecondProperty = AvaloniaProperty.Register<UserControlB, int>(nameof(StopSecond), 0, defaultBindingMode: BindingMode.TwoWay);

	public int StopSecond
	{
		get => GetValue(StopSecondProperty);
		set => SetValue(StopSecondProperty, value);
	}
}

6๊ฐœ์˜ ์ข‹์•„์š”

์™€!!! ์ •์ƒ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค ใ… ใ…  ๋ช…๋ช…๊ทœ์น™์ด ์ค‘์š”ํ•  ์ค„์ด์•ผ ใ… ใ…  ์–ด์ œ ํ•˜๋ฃจ๋™์•ˆ ์ด๊ฑธ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋ณ„์ง“์„ ๋‹ค ํ–ˆ๋Š”๋ฐ ๋„ˆ๋ฌด ์†์‹œ์›ํ•ฉ๋‹ˆ๋‹ค!! ใ…Žใ…Ž ์ •๋ง ๋„ˆ๋ฌด๋„ˆ๋ฌด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค~!!!

2๊ฐœ์˜ ์ข‹์•„์š”