다음과 같은 WPF의 다양한 데이터 바인딩 모드를 이해하지 못합니다.
- 일방 통행
- 양방향
- 한 번
- 기타…
각 모드는 무엇을 의미합니까?
언제 사용해야합니까?
답변
OneWay
: 바인딩 된 속성이 사용자 인터페이스를 업데이트 할 때 사용합니다.TwoWay
: 이것은 동일한 동작을OneWay
가지며OneWayToSource
결합됩니다. 바인딩 된 속성은 사용자 인터페이스를 업데이트하고 사용자 인터페이스의 변경 사항은 바인딩 된 속성을 업데이트합니다 ( 예 : aTextBox
또는 a 와 함께 사용Checkbox
).OneTime
: 이것은OneWay
사용자 인터페이스를 한 번만 업데이트한다는 점 을 제외 하면 동일한 동작을 합니다. 이것은 바인딩에 대한 기본 선택이어야합니다 (다양한 이유로 여기서 자세히 설명하지 않겠습니다). 실제로 추가 기능이 필요한 경우에만 다른 유형의 바인딩을 사용해야합니다.OneWayToSource
: 이것은 반대OneWay
-사용자 인터페이스 값 변경은 바인딩 된 속성을 업데이트합니다.
아무것도 지정하지 않으면 사용중인 컨트롤에 따라 동작이 달라집니다.
자세한 내용 BindingMode
은 MSDN의 열거 형을 참조하십시오 .
답변
바인딩은 다음 두 항목으로 구성됩니다.
- 소스 (일반적으로 MVVM 시나리오의 ViewModel)
- 타겟 (UI 컨트롤)
대상은 DependencyObject
(바인딩이 작동하기 위해)이어야하며 소스는 a DependencyObject
이거나 변경되는 WPF 바인딩 시스템을 모방하는 메커니즘이 있어야합니다 ( INotifyPropetyChnaged
인터페이스 구현).
MVVM은 ViewModel 프로젝트가 View 관련 참조에서 자유로울 것을 권장하므로 INotifyPropertyChanged
인터페이스를 사용하여 WPF 바인딩에 의해 수신되는 Source 개체를 만드는 것이 좋습니다 . 바인딩은 Source 속성과 Target 속성간에 발생합니다 (이어야 함 DependencyProperty
). 예를 들면 TextProperty
의 TextBox
클래스 (예를 들어)에 바인딩 인 UserName
뷰 모델의 속성입니다. WPF 바인딩은 네 가지 유형의 바인딩을 제공합니다. 바인딩은 달리 실행하도록 지정하지 않는 한 UI 스레드에서 실행됩니다.
- OneWay : 대상 속성 은 변경되는 소스 속성을 수신하고 자체적으로 업데이트합니다. 프로그래밍 방식으로 ViewwModel의
UserName
속성을 변경 하면 텍스트 상자에 반영됩니다. 바인딩 시스템 이 변경 사항에 대해 Source 만 감시하므로 이는 중간 비용 입니다. - TwoWay : 대상 속성은 변경되는 소스 속성을 수신하고 자체적으로 업데이트합니다. AND 소스 속성은 변경되는 대상 속성을 수신하고 자체적으로 업데이트됩니다.
TextProperty
및UserName
속성은 모두 동기화 된 상태로 유지되며 하나가 변경되면 서로 업데이트됩니다. 바인딩 시스템이 양쪽의 변화를 지켜봐야하기 때문에 이것은 가장 비용이 많이 듭니다. - OneWayToSource : 대상 속성이 변경되면 Source 속성이 변경됩니다. 사용자가 변경하는 경우
TextProperty
는UserName
속성이 변경된 값을 차지합니다. 바인딩 시스템이 Target 만 변경 사항을 감시하므로 이는 다시 중간 비용 입니다. - OneTime : Binding 수명 동안 한 번만 발생하며 Binding이 발생하면 Target 속성이 Source 속성 으로 업데이트됩니다 . 이것은 최소 비용이며 예를 표시하는 정적 데이터를 시나리오에 적당하다
Label
,TextBlock
등
아무것도 언급하지 않으면 모든 대상 속성에는 자신과 관련된 기본 바인딩 모드가 있습니다. 예를 들어, TextProperty
의 TextBox
기본 바인딩 모드는 TwoWay
. 를 들어 TextProperty
(A)의 TextBlock
그것은 하나의 방법입니다.
특히 UI에 많은 수의 컨트롤이있는 경우 애플리케이션 지연 시간을 줄이는 데 도움이 될 수 있으므로 올바른 모드를 선택하는 것이 좋습니다.
MVVM에 대한 자세한 내용은 여기 내가 쓴 기사입니다.