Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/jamesnet214/wpf-xaml-binding


https://github.com/jamesnet214/wpf-xaml-binding

Last synced: 19 days ago
JSON representation

Awesome Lists containing this project

README

        

## Xaml Binding

이 리포지토리는 WPF Xaml Binding 개념과 기술을 활용하는데 필요한 설명을 다루는 Article입니다.

더 알아보기 »

| Star | License | Activity |
|:----:|:-------:|:--------:|
| Github Stars | License | Commits-per-month |


## DataContext

__DataContext는 FrameworkElement에 포함된 속성입니다.__
`PresentationFramework.dll`

```csharp
namespace System.Windows
{
public class FrameworkElement : UIElement
{
public static readonly DependencyProperty DataContextProperty;
public object DataContext { get; set; }
}
}
```

그리고 WPF의 모든 UI 컨트롤은 `FrameworkElement` 클래스를 상속합니다.
> 바인딩 또는 데이터 컨텍스트를 배워가는 시점에서 FrameworkElement를 더 깊이 연구할 필요가 없습니다.
> 하지만 모든 UI 컨트롤을 포함할 수 있는 가장 가까운 개체가 FrameworkElement라는 사실을 간단히 언급하기 위함입니다.

### _DataContext is always the reference point for Binding._
Binding can directly recall values for the DataContext type format starting with the nearest DataContext.
```xaml

```
`Text="{Binding}`에 바인딩된 값은 가장 가까운 데이터 컨텍스트인 `TextBlock`에서 직접 전달됩니다.
따라서 `Text`의 바인딩 결과 값은 'James'입니다.

- __Type integer__
Xaml에서 DataContext에 직접 값을 할당하는 경우 정수 및 부울과 같은 값 유형에 대해 먼저 리소스 정의가 필요합니다.
왜냐하면 모든 문자열이 문자열로 인식되기 때문입니다.

#### 1. Xaml에서 System `mscrollib` 사용
> Simple type variable type is not supported by standard.
> 어떤 단어로도 정의할 수 있지만 대부분 `sys` 단어를 사용합니다.
```xaml
xmlns:sys="clr-namespace:System;assembly=mscorlib"
```

#### 2. xaml에서 `YEAR` 리소스 키 생성
> StaticResource 형식으로 생성할 유형의 값을 선언합니다.
```xaml

2020

...

```

- __All type of value__
값이 데이터 컨텍스트에 직접 바인딩되는 경우는 거의 없습니다.
Because we're going to bind an object.
```xaml

true
7.77

...




```

- __Another type__
스트링뿐만 아니라 다양한 타입이 가능합니다. 데이터 컨텍스트가 객체이기 때문입니다.

WPF에서 바인딩을 사용할 때, 대부분의 개발자들은 DataContext의 기능 및 중요성에 대해 완전히 알지 못합니다. 특히 대규모 WPF 프로젝트를 담당하거나 참여하는 경우 애플리케이션의 DataContext 계층을 보다 명확하게 이해해야 합니다. DataContext 개념이 없으면 기능을 자유롭게 구현하는 데 한계가 있기 때문입니다.


* * *

## Binding

- [DataContext Binding](#datacontext-binding)
- [Element Binding](#element-binding)
- [MultiBinding](#multibinding)
- [Self Property Binding](#self-property-binding)
- [Find Ancestor Binding](#find-ancestor-binding)
- [TemplatedParent Binding](#templatedparent-binding)
- [Static Property Binding](#static-property-binding)

### DataContext Binding

`string property`
```xaml

```

### Element Binding

```xaml

```

### MultiBinding

```xaml






```



### Self Property Binding

```xaml

```
자신의 속성을 바인딩해야 하는 경우 요소 바인딩 대신 `Element Binding`을 사용할 수 있습니다.
자신의 속성을 바인딩하기 위해 `x:Name`을 선언할 필요가 없습니다.

```xaml

```



### Find Ancestor Binding

가장 가까운 상위 컨트롤을 기준으로 가져옵니다.

```xaml

```

`Trigger`에서 상위 개체의 속성에 액세스할 때 유용합니다.
```xaml

```

DataContext 객체가 있는 경우 해당 속성을 사용할 수 있습니다.
그러나 `DataContext`(ViewModel)에 대한 접근은 가급적 피하는 것이 좋습니다.
```xaml

```

현재 바인딩된 `DataContext`가 아닌 다른 `DataContext`를 바인딩하려는 경우 다음 방법을 사용할 수 있습니다.
```csharp
public partial class A : UserControl
{
public A()
{
InitializeComponent();
DataContext = new MainViewModel();
}

public class MainViewModel
{
public B G1VM { get; set; } = new B();
public C G2VM { get; set; } = new C();
}
}
```

```xaml





```

### TemplatedParent Binding

`ControlTemplate` 내에서 사용할 수 있는 메서드로 `ControlTemplate`의 자신의 속성을 가져올 수 있습니다.

```xaml

<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}"/>
</ControlTemplate>
</Setter.Value>
</Setter>

```

모든 속성 및 데이터 컨텍스트에 접근할 수 있습니다.

```xaml

```

### Static Property Binding

바인딩 속성 값에 직접 접근할 수 있습니다.

#### 1. `static` 속성을 선언합니다.

```csharp
namespace Exam
{
public class ExamClass
{
public static string ExamText { get; set; }
}
}
```

#### 2. XAML에서 정적 클래스를 사용합니다.

```xaml

```

#### 3. Binding property.

```xaml

```

_또는 `Converter`를 사용하는 것처럼 리소스 키를 설정할 수 있습니다._

```xaml


...

```


* * *

## Bad Binding & Good Binding

#### :heavy_check_mark: 바인딩할 속성이 DataContext에 포함된 경우 ElementBinding을 사용할 필요가 없습니다.
DataContext에 포함된 속성에 해대해 ElementBinding을 사용하는 것은 기능적으로 문제가 없지만, 바인딩의 기본 패턴을 깰 수 있습니다.

#### :slightly_frowning_face: Bad Binding

```xaml

...

```

#### :grinning: Good Binding

```xaml

...

```


#### :heavy_check_mark: 상위 컨트롤의 속성을 사용할 때는 ElementBinding을 사용하지 마세요.

#### :slightly_frowning_face: Bad Binding

```xaml


...
```

#### :grinning: Good Binding

```xaml


...
```

#### :laughing: Great!

```xaml


...
```

#### :heavy_check_mark: 자기 자신의 속성을 사용할 때 ElementBinding을 사용하지 마세요.

#### :slightly_frowning_face: Bad Binding

```xaml

```

#### :grinning: Good Binding

```xaml

```


## Reference
[:bookmark_tabs:](https://stackoverflow.com/questions/84278/how-do-i-use-wpf-bindings-with-relativesource) **StackOverflow**   How do I use WPF bindings with RelativeSource?