2012-04-05 4 views
1

은 mvvm 패턴으로 인해 ViewModel에 대해 아무것도 모르는 모델입니다.WPV MVVM 패턴 ObservableCollection

ListBox 내 모델 중 하나에 필드를 만들면 어떻게됩니까? 잘 생겼어. 하지만 다음 단계에서는이 값을 ModelView의 ObservableCollection에 연결해야합니다.

나는이 작업을 수행 할 수 있습니다

var에 myCollection = 새 ObservableCollection에 (으로 myList를);

그러나이 경우 OC에 대한 모든 이점을 잃었습니다. 이 컬렉션은 고정되어 있으며 삽입 또는 업데이트는이 컬렉션에 연결된 내 뷰에 반영되지 않습니다.

의견이 있으십니까?

답변

1

당신이 ObservableCollection에로 myList에 값을 복사하는

var myCollection = new ObservableCollection (ListBox) 

를 호출 할 때. 여기에 ListBox 목록이 업데이트되지 않습니다.

이 원하는 효과, 그리고 당신이 당신의 ViewModel을 업데이트 할 수 있습니다 경우

///... 
var myCollection = new ObservableCollection (ListBox) 
myCollection.CollectionChanged += (sender, args) => RefreshListBox(myCollection); 
///... 
private void RefrehListBox(ObservableCollection<...> collection){ 
//Refresh ListBox with collection 
} 

이 방법을마다 ObservableCollection에 업데이트, 변경 사항과 기본 모델을 동기화 할 수 있습니다.

+0

ModelView를 모델과 동기화하는 좋은 방법입니다. 그러나 그 반대의 경우 - 모델에서 ViewModel을 업데이트하는 방법은? – alerya

+2

그런 식으로 원활하게 작동하게하려면 다른 이벤트 메커니즘이 필요할 것입니다. Model에서 다른 ObservableCollection을 사용하거나 VM이들을 수있는 자체 이벤트를 작성할 수 있습니다. –

2

ObservableCollection은 일반적으로 인터페이스를 자동으로 업데이트하기 때문에 ObservableCollection을 사용합니다. 나는 네가 뭔가 잘못하고 있다고 생각한다. ViewModel에서 ObservableCollection에 요소 목록이있는 경우 일반 요소 목록을 사용하여 요소 목록을 초기화 할 수 있습니다. OC를 ListBox로 초기화하면 안됩니다. 보기에 바인딩해야합니다. OC에 요소를 추가하면보기가 업데이트됩니다.

+0

그러나 Model에서 myList를 업데이트합니다 - View Model에서 OC가 없습니다. OC를 업데이트하기 위해 내 이벤트를 만들어야하는 것처럼 보입니까? – alerya

+1

모델에 변경 사항을 알릴 수있는 방법이 없다면, 그럴 것입니다. 예. 기본 M 메서드를 호출하고 VM의 ObservableCollection을 새로 고치는 요소를 추가하는 VM 메서드가 있어야합니다. ComboBox는 VM에서 OC에 바인딩됩니다. – Goran

관련 문제