3

간단한 문제인 것 같지만 작동시키지 못합니다.새 값을 할당 한 후 ObservableCollection을 DataGrid에 바인딩합니다.

messagesGrid.source = src; //messagesGrid is the name of the UserCntrol above 
: 나는 버튼 클릭시 값을 설정 부모 UserControl에서

<data:DataGrid x:Name="dgMessages" Grid.Row="2" AutoGenerateColumns="True" 
ItemsSource="{Binding source}" ></data:DataGrid> 

:

public ObservableCollection<HL7Message> source {get; set;} 

그리고 다음과 같은 바인딩 :

는 나는 다음과 같은 속성을 UserControl을이

내 DataGrid가 업데이트 될 것으로 기대하지만 그렇지 않습니다. 내가 잘못하고있는 것을 지적 해 주시겠습니까?

답변

5

Auto-properties 슬프게도 변경 알림을 지원하지 않습니다. 따라서 source -Property를 설정하면 DataGrid는 컬렉션이 변경되었음을 알 수 없습니다. .NET에서 속성은 일반적으로 그렇게 작성되기 때문에 대문자로 Source

class YourUserControlClass: INotifyPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) {  
    if (null != PropertyChanged) {   
      PropertyChanged(this,e);  
    } 
    } 

    ObservableCollection<HL7Message> m_source; 

    public ObservableCollection<HL7Message> Source { g 
     get{return m_source;} 
     set{ 
      if(value != m_source){ 
       m_source=value; 
       OnPropertyChanged("Source"); 
      } 
     } 
    } 
    .... 

유의하시기 바랍니다, 내가 쓴 첫 글자 :

하나의 가능성은 messagesGrid.source -Property에 대한 INotifiyPropertyChanged을 구현하는 것입니다. 바인딩은 대소 문자를 구분하므로 바인딩을 적절히 변경해야합니다.

<data:DataGrid x:Name="dgMessages" Grid.Row="2" AutoGenerateColumns="True" ItemsSource="{Binding Source}" ></data:DataGrid> 
+0

감사합니다. 필자는 아래에서 지적했듯이 ObservableCollection이 이미 INotifyPropertyChanged를 구현한다는 사실에 혼란 스러웠습니다. 그 의미가 무엇인지 알 수 없었습니다. – Masha

+0

또 다른 질문 - 내 속성의 "set"섹션에'dgMessages.ItemsSource = _source; '를 넣으면 정확 할 것입니다. – Masha

+0

@Masha : OnPropertyChanged ("Source")를 호출하지 않으면 작동하지 않습니다 . 그러나 if-statement를 생략 할 것을 요구하면 이것이 가능할 것입니다. 그러나 실제 변화가 없다면 개인적으로 변경 통보를하는 것이 나쁜 습관이라고 생각합니다. – HCL

1

문제는 버튼 클릭에 source 변경에 대한 참조가있을 때 아무것도 자동으로 업데이트 할 수있는 UI를 말할하는 것입니다. source을 종속성 속성으로 설정하거나 INotifyPropertyChanged을 구현하고 source의 설정자에서 PropertyChanged 이벤트를 호출해야합니다.

private ObservableCollection<HL7Message> source; 
public ObservableCollection<HL7Message> Source 
{ 
    get 
    { 
    return this.source; 
    } 

    set 
    { 
    this.source = value; 
    this.NotifyPropertyChanged(() => this.Source); 
    } 
} 
+0

내가 혼란스러워하는 사실은 ObservableCollection이 이미 INotifyPropertyChanged (MSDN의 어딘가에 대해 읽음)를 구현했거나 NotifyPropertyChanged() 이벤트를 사용할 수 있다는 것을 의미합니까? – Masha

+0

종속성 속성의 경우 MSDN은 다음과 같이 말합니다. 바인딩 원본이 되려면 속성이 종속성 속성 일 필요는 없습니다. 모든 CLR 속성을 바인딩 소스로 사용할 수 있습니다. 그러나 바인딩의 대상이 되려면 해당 속성이 종속성 속성이어야합니다.그래서 나는 그것을 사용할 수 있다고 생각하지 않습니다 .. – Masha

관련 문제