Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jamesnet214/wpf-xaml-binding
https://github.com/jamesnet214/wpf-xaml-binding
Last synced: 19 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/jamesnet214/wpf-xaml-binding
- Owner: jamesnet214
- License: mit
- Created: 2020-11-12T01:53:17.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2022-07-03T13:42:53.000Z (over 2 years ago)
- Last Synced: 2024-05-02T01:33:13.349Z (7 months ago)
- Size: 125 KB
- Stars: 7
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
## Xaml Binding
이 리포지토리는 WPF Xaml Binding 개념과 기술을 활용하는데 필요한 설명을 다루는 Article입니다.더 알아보기 »
| Star | License | Activity |
|:----:|:-------:|:--------:|
| | | |
## 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?