0

내 목록에서 내 ViewModel의 observableCollection에 항목을 바인딩했습니다 (각 자체 observableCollection을 가진 두 개의 목록보기가 있음). 또한 ViewModel의 속성에 여러 상태 표시 줄 속성을 묶었습니다.모델이 변경되었지만 속성이 변경되지 않았을 때 MVVM에서 뷰에 알리는 방법

내보기 모델에서 '메모리'버퍼를 복사하는 몇 가지 특별한 종류의 복사/붙여 넣기 기능이 있습니다. 실제로 내 뷰 모델 (및 아래 모델)의 속성은 메모리 버퍼에 대한 포인터 일뿐입니다. 복사 할 때 속성이 변경되었음을 알지만 값 자체는 setter로 변경되지 않습니다 (따라서 INotifyPropertyChanged는 호출되지 않습니다).

어떻게 목록보기를 새로 고칠 수 있습니까? 뷰 모델에서 메서드를 호출하여 값을 다시 계산할 수 있기 때문에 상태 표시 줄이 그리 어렵지 않습니다. 그러나 매우 비실용적 인 목록보기의 데이터입니다.

MVVM이 아닌 경우 데이터로 다시 채우 겠지만 MVVM/바인딩을 사용하면 가능하지 않습니다. 의견에 따라

+1

이러한 "메모리 버퍼"를 복사 할 때 적절한 알림을 표시 할 수 있습니까? 당신은 항상 부동산 세터에 의존 할 필요는 없습니다. – Bernard

+0

예, 존재하지 않는 문자열 (예 : 'Memory'속성)을 만들고 목록보기를 채우면 내보기에 반응합니다. 나는 그것이 더러운 트릭으로 여겨졌다 고 생각했다. –

+2

UI를 업데이트하도록 PropertyChanged 이벤트를 수동으로 발생시킬 수는 없습니까? 'RaisePropertyChanged ("SomeProperty");' – Rachel

답변

2

그래서, 뷰 모델에서 당신이 항목의 ObservableCollection에이 (ObservableCollection에 말). 당신이해야 할 일은 MyItem (즉, 컬렉션의 각 항목)이 INotifyPropertyChanged에서 파생되는지 확인하는 것입니다. 그런 다음 컬렉션 내의 항목을 변경하면 PropertyChanged 이벤트가 발생합니다. WPF 목록보기에서이를 가져옵니다.

다른 주석 기자가 설명하는 RaisePropertyChanged는 일반적으로 VM 클래스에 추가되는 유틸리티 메소드입니다 (일반적으로 모든 VM 클래스의 공통 기본 클래스). 그것은하여 PropertyChanged 이벤트 제기

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

다른 commentors에 의해 묘사 된대로를, 당신은 단지 세터 내에서하여 PropertyChanged 이벤트를 발생 지시 아무것도 없다. Copy 메서드 내에서 RaisePropertyChanged를 적절한 속성 이름으로 호출하면됩니다 (변경된 각 속성에 대해 여러 번 호출 할 수 있음).

EDIT : MVVM 디자인 패턴을 따르고 싶다면 VM에서 뷰로 메소드를 호출하면 안됩니다 (MVVM의 주요 개념 : ViewModel은 뷰 불가 인). 상태 줄을 제어하는 ​​모든 속성에 대해 RaisePropertyChanged 메서드를 호출하면됩니다.

+0

답변을 주셔서 감사합니다 ... 여러 이벤트를 제기하는 것은 내가보기에 항목이 변경되는 대부분의 경우에 알기 때문에 갈 길과 같이 보입니다. 내가하지 않으면 전체를 올리거나 전체 목록보기를 위해 이벤트를 제기 할 수 있습니다. –

0

해결 방법 : 이러한 메모리 버퍼를 복사 할 때

가 적절한 통지를 올립니다 : 사용

RaisePropertyChanged("SomeProperty") 
관련 문제