2009-02-20 3 views
5

Ok, 그래서 최근의 비공개 프로젝트에서 WPF를 사용하려고 노력하고 있습니다. 나는 데이터 바인딩에 솔직하게 화가났다. 데이터를 UI에 직접 바인딩하여 작업을 단순화한다고 생각했습니다. 그러나 UI가 변경된 경우이를 알리기 위해 INotifyPropertyChanged를 구현해야한다는 사실을 배울수록 전반적인 생산성을 향상시키는 것으로 보입니다.WPF 데이터 바인딩은 가치있는 것보다 더 고통스럽게 만듭니다.

내가 누락 된 항목이 있습니까? 그것은 일의 무리처럼 보이고 INotifyPropertyChanged를 구현하는 클래스를 만들어야하는 것은 작동하도록 데이터 바인딩을 얻는 비린내처럼 보입니다.

무엇이 누락 되었습니까? 나는 뭔가를 놓치고 있어야합니다. 데이터 바인딩을 쉽게 또는 최소한으로 만드는 방법을 알려주십시오.

답변

4

기본 데이터 소스가 변경 될 때 UI에 알리려면 일부 알림 메커니즘이 필요합니다. WPF의 경우 INotifyPropertyChanged는 그 메커니즘입니다.

Windows Forms에서도 동일하지만 Windows Forms는 <Property>Changed이라는 이벤트가있는 이전 알림 메커니즘도 지원합니다.

그러나 원하는 모든 작업을 데이터에 한 번 묶어서 표시하려면 이러한 메커니즘이 필요하지 않습니다.

알림을받지 못하는 경우 데이터 소스에 바인딩하면 제대로 작동합니다.

+0

클래스의 속성이 변경되면 언제든지 PropertyChanged 이벤트를 발생시켜야합니까? 지루해 보인다. 바인딩하려는 클래스의 코드가없는 경우에는 어떻게해야합니까? 이게 지저분 해지지 않니? –

+0

GordonG의 경우 Model-View-ViewModel 패턴을 사용하는 것이 좋습니다. ViewModel (중간 계층)은 기본적으로 기본 Model 속성을 다시 노출 할 수 있도록하지만 View 데이터 바인딩은 ViewModel의 다시 노출 된 속성 (모델이 아닌!)을 다시 표시 할 수있게하여이 문제를 처리합니다. – Adrian

+0

(위에서 계속) ViewModel은 INotifyPropertyChanged를 구현하고 'get'호출의 경우 기본 모델의 값을 속성별로 반환하지만 'set'호출에서는 기본 모델의 속성 값을 설정하고 PropertyChanged를 발생시켜 View에서 볼 수 있도록합니다. 갱신 된 값 – Adrian

4

진실을 말하면, 나쁘지 않다고 생각하지 않았으며 매우 실행 가능한 솔루션이라고 생각합니다.

이 간단하고, 데이터 모델 객체를 가지고 : 쉽게를 통해 간단한 텍스트 상자에 바인딩

Public Class SimpleItemViewModel 
Implements INotifyPropertyChanged 

Private _item As String 
Public Property Item As String 
    Get 
     return _item 
    End Get 
    Set (value as string) 
     _item = value : OnPropertyChanged("Item") 
    End Set 
End Property 

Protected Overridable Sub OnPropertyChanged(propChange as string) 
    Raise Event PropertChanged(me, new PropertyChangedEventArgs(propChange)) 
End Sub 
Public Event PropertyChanged(sender as object, e as PropertyChangedEventArgs) 
End Class 

: 나는 더러운 플래그를 가지고 싶다면,

<Textbox Text="{Binding Item}" /> 

추가, 난 쉽게 할 수 OnPropertyChanged 하위에 플래그를 설정하고 사용자 변경 사항을 저장해야하는지 여부를 쉽게 결정할 수 있습니다.

데이터 액세스 레이어와이 항목을 보유하고있는 UI 사이에있는 일련의 클래스를 갖는 것이 가장 쉽다는 것을 알게되었습니다. 비즈니스 로직과 DAL이 원자적인 값보다는 이러한 클래스를 전달하도록 할 수도 있습니다.

+0

상속 된 데이터 컨텍스트에 대한 아이디어 때문에 위의 Text = "{Binding Item}"이 작동한다는 점을 기억하십시오. 귀하의보기의 데이터 컨텍스트는 ViewModel입니다. – Adrian

+0

위의 구문은 자세한 정보이지만 PropertyChanged 이벤트를 임의로 실행할 수 있습니다. 하나의 값을 설정할 때 이러한 여러 이벤트를 실행할 수 있습니다 (아마도 다른 속성은 계산 된 속성이기 때문에 getter 만 가질 수 있습니다). – Adrian

+0

KP - 정확합니다. 또한 하위 컨트롤 또는 컨테이너가있는 경우 프로그래밍 방식으로 해당 컨테이너의 데이터 컨텍스트에 추가보기 모델을 할당 할 수 있습니다. –

0

WPF/Silverlight에서 모델 뷰 패턴을 구현하는 유일한 방법은 데이터 바인딩입니다. UI에서 모델을 격리하는 INotifyPropertyChanged를 구현하면 모델이 UI-stupid가 될 수 있습니다. 또한 UI에 정보를 채울 때 많은 UI 코드를 저장합니다.

내가 좋아하는 또 다른 이점은 {바인딩} 바로 가기를 사용하여 동일한 데이터로 하위 컨트롤을 추가로 바인딩 할 수 있다는 것입니다.

0

먼저 INotifyPropertyChanged가 데이터 바인딩을 작업 종속성 속성으로 가져 오는 유일한 방법은 아닙니다.

두 번째로 INOTifyPropertyChanged는 AOP를 사용하는 경우 엔티티 클래스에 단 한 줄의 코드만으로 구현 될 수 있습니다. 실제로 모든 알림 호출을 직접 수행 할 필요는 없습니다.

전반적으로 데이터 바인딩은 특히 데이터 생성 소스에서 자동으로 바인딩 된 컨트롤을 만들기 위해 코드 생성을 수행 할 때 큰 이점이라고 말하고 싶습니다.

2

구현 변경 INotifyProperty은 특별히 어려운 것은 아니며 한 명의 회원으로만 보았습니다.

기본 개체의 변경 사항을 예상하지 않으면 INotifyProperty이 변경 될 염려가 없으며 Mode=OneTime이라는 바인딩을 사용하십시오.

기본 개체가 변경 될 수 있고 GUI에 변경 내용이 반영되도록하려면 INotifyProperty이 변경되었음을 알리는 알림없이 다른 방법을 얻을 수 있습니까? 바인딩 된 항목이 해당 바인딩의 소스를 폴링 할 것으로 예상하는 것은 타당하지 않습니다.

개인적으로 나는 WPF가 그립을 잡는데 약간의 시간이 걸렸지 만, 이제는 내가 편안함을 얻고있어서 믿을 수 없을 정도로 강력하고 즐거운 것을 발견했다. 나는 WPF를 사용하는 사람들이 그것에 도전하기를 바라고 있습니다.

0

데이터 바인딩을 구조화하는 좋은 방법을 찾고 있다면 논리 트리에서 DataContext를 한 번만 설정 한 다음 바인딩 경로를 사용하여 UI의 다양한 부분을 채 웁니다.

0

바인딩에서 가능한 한 선언적이어야합니다. 템플릿 시스템이 제대로 작동하도록하고 DataType을 명시하는 DataTemplate을 많이 사용하도록하십시오.

1

XAML의 바인딩은 매우 쉽지만 코드의 동적 WPF 데이터 바인딩은 고통스럽고 혼란 스럽습니다.

+0

결국 나야! –

관련 문제