2012-03-07 3 views
0

A, B 및 C의 세 클래스로 구성된 모델이 있습니다. A의 ObservableCollection이 B이고 B의 ObservableCollection이 C입니다. C에 대한 참조가 있습니다 .. 나는 필요 없다고 생각한다) 부모에게 (B), B는 A에 대한 참조를 가지고있다. A, B, C의 각 속성은 변경 사항을 알린다.UI에서 "업데이트"되지 않은 알림 속성

그런 다음 할당 된 모든 개체를 "추적"하는 Model 클래스가 있습니다. 그래서 ObservableCollection of A, B와 C가 있습니다 (단 하나만 필요합니다; 더 빠른 참조를 위해서만 B와 C의 목록을 유지합니다).

내 UI에는 사용자 지정 컨트롤이 있습니다.이 UI에는 ViewModel이 있습니다. 보기에는 목록이 있습니다. 그것의 ItemSources는 ViewModel에 명명 된 observablecollection에 바인딩됩니다. 이 ObservableCollection은 RowViewModel입니다. 각 RowViewModel는 C 객체에 대한 참조를 유지합니다.

내 응용 프로그램 (A, B, C 객체를 생성) 모델을로드하고이 메서드 호출하여 뷰의 목록을 설정합니다 (아마도이 ​​문제가 있습니까?)

public void setSensors(IList<C> list) 
     { 
      this.sensors.Clear(); 
      if (list != null) 
      { 
       foreach (var row in list) 
        this.sensors.Add(new RowViewModel(row)); 
      } 
     } 

문제가있는 경우이다 내 C 객체의 속성을 수정합니다. UI에 반영되지 않습니다.

누군가 나를 도울 수 있습니까? 당신에게

프란체스코 감사

편집 : (SOLVED) 내 코드를 확인하고 답을 덕분에 한 가지를 변경 : 대신 뷰 모델 (와 뷰 모델로 내 UI 요소를 결합 단순히 전화를 "재" 모델 속성에), 나는 직접 UI를 실제 속성에 바인딩하고 작동합니다! MVVM에서는 "바로 가기"를 사용할 수 없습니까? 아니면 내가 사용하는 경우 해당 속성에 대한 알림을 등록하고 "전파"해야합니까?

+0

속성이 바뀌면 이벤트가 올바르게 실행됩니까? – squelos

+0

잘 .. 나는 그렇다고 생각한다. 내 "NotifyPropertyChanged"에 중단 점을 넣고 입력합니다. – Francesco

+0

누군가 해당 이벤트를 수신하고 있는지 확인해보십시오. 올바른 물체가 효과적으로 듣고 있다면 잘 모르겠다./ – squelos

답변

1

RowViewModel 개체에 바인딩되어 있기 때문에 사용자의 UI가 업데이트되지 않았다고 생각합니다. C이 아닙니다. 따라서 RowViewModel의 생성자에 CPropertyChanged 이벤트를 구독하고 RowViewModel.PropertyChanged을 통해 이러한 변경 사항을 알릴 수 있습니다. 그런데 UI에서 바인딩 예제를 제공 할 수 있습니까?

업데이트 :

"프록시"PropertyChanged 이벤트의 예 :

public class Model: INotifyPropertyChanged 
{ 
    private string _YourProperty; 
    public string YourProperty 
    { 
    get { return _YourProperty; } 
    set 
    { 
     if (_YourProperty == value) return; 
     _YourProperty = value; 
     RaisePropertyChanged("YourProperty"); 
    } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string propertyName) 
    { 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class ViewModel: INotifyPropertyChanged 
{ 
    private Model _Model; 

    public ViewModel(Model model) 
    { 
    _Model = model; 
    _Model.PropertyChanged += OnModelPropertyChanged; 
    } 

    public string YourProperty 
    { 
    get { return _Model.YourProperty; } 
    } 

    private void OnModelPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
    if (e.PropertyName == "YourProperty") 
     RaisePropertyChanged("YourProperty"); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string propertyName) 
    { 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

또한 http://george.softumus.com/2011/10/inotifypropertychanged-and-magic.html 읽을 수 있습니다 - 속성 이름으로 "마법 문자열"(하드 상수)를 사용하지 않도록하는 방법에 대해 설명합니다.모델이 자동으로 UI를 업데이트하기 위해

+0

답변을 추가하는 평판이 없습니다. "2"이름 = "isOnlineBox"의 IsChecked = "{바인딩 isOnline}"HorizontalAlignment로 = "센터"VerticalAlignment = "센터" 너비 = "25"높이 = "25"/> isOnline 속성이 RowViewModel에 있습니다 공용 부울 isOnline { get { return myC.baisOnline; } } 의심의 여지가 있습니다. b 속성은 "관찰 가능"하지 않지만 온라인입니다. – Francesco

+0

귀하의 속성이 생성자에 설정되어있는 모든 광고에서 프록시 변경 이벤트가 필요하지 않습니다. 그리고 그것은 변하지 않습니다. 실제로 모델의 속성이 변할 때마다보기 모델의 모델을 업데이트하고 있기 때문에 실버 라이트가 아무 이유없이 모든 것을 새로 고침하게됩니다. –

+0

좋아, 아주 간단한 예제 - 당신은'Name'과'Version'과 같은 2 개의 속성을 가진 모델을 가지고 있고보기에서 이것을 ' [v. ]'(예 :'SuperTool [v.2]'). 프록 싱 속성은 쉽게 할 수 있습니다 (WPF에서는'IMultiValueConverter'를 사용할 수 있지만 Silvelight는 그렇지 않습니다). 실제로 프록시를 사용하려는 다른 예제가 많이 있습니다. 물론, 거의 언제나 다른 기술을 사용할 수 있습니다. 그러나 모든 특정 시나리오에서 가장 좋은 방법은 무엇인지에 대해 매우 논쟁의 여지가있는 질문입니다. 따라서 프록시가 존재한다는 사실을 아는 것이 더 낫습니다. 그리고 그것은 자신의 선택입니다. – chopikadze

1

규칙 : -

  1. 유형 컬렉션의 재산은하지 않는 한 귀하의 모델,
  2. 모델의 모든 속성을에서 INotifyPropertyChanged 인터페이스를 구현해야합니다
  3. 형 ObservableCollection에이어야합니다 문자열 또는 값 형식, INotifyPropertyChanged를 구현해야하는 형식이어야합니다.
  4. 컬렉션 형식의 value 속성이 변경되면 ObservableColle에서 파생 된 경우에도 속성 이름 PropertyChanged가 발생합니다. ction
+0

나는이 규칙을 따랐다 고 생각합니다 ... – Francesco

+0

컬렉션 인스턴스의 변경이 컬렉션의 항목 추가/제거와 동일하다고 가정하기 때문에 대부분 4 번째 규칙이 뒤 따르지 않습니다. 그렇지 않으면 VS에서 바인딩 경고를 확인해야합니다 출력 창. –

관련 문제