2012-07-03 4 views
0

간단한 MVVM 패턴을 다루었으므로 이후 WPF에서 데이터 바인딩의 모든 기능을 자세히 살펴 보았습니다. 나는 내가 머리를 감쌀 수없는 문제에 봉착했다. 우선 다음 MainWindowViewModel 코드를 가지고 :WPF MVVM Multiple View Issue, ListBox.SelectedItem 사용

ObservableCollection<DataRecord> _SomeData = new ObservableCollection<DataRecord>(); 
public ObservableCollection<DataRecord> SomeData 
{ 
    get 
    { 
     return _SomeData; 
    } 
    set 
    { 
     _SomeData = value; 
    } 
} 

public MainWindowViewModel() 
{ 
    CurrentViewModel.Add(new RandomViewModel(SomeData)); 
} 

대신 코드의 전체 길이를 붙여, 나는 각 기본 추가 (이미지 탐색)의 이미지 속성을 참조, ViewModelBase의 ObservableCollection에 <>에리스트 박스를 결합했다. 지금! 문제 :

나는 ListBox.SelectedItem에서 반환 된 문자열을 사용하여 ViewModel에서 뷰를 참조하기 위해 DataTemplate을 사용하고 있습니다. RandomViewModel은 매개 변수를 전달해야하기 때문에 ListBox.SelectedItem을 클릭 할 때마다 ListBox에서 생성 된 뷰 대신 새 뷰가 인스턴스화됩니다. 이 문제가 발생하는 이유는 간단합니다. 새 View에서는 RandomViewModel을 사용하여 데이터 바인딩을 참조해야합니다. 그래서! ViewModel/View Navigation에 대한 악명 높은 ListBox.SelectedItem을 사용하여 ViewModel에 매개 변수가 전달되어야하더라도 View를 만들고 그 ViewModel을 참조해야하는 이유는 무엇입니까? 또는! 이미 인스턴스화 된 ViewModel을 사용하여 새로 생성 된 View에 대한 참조로 사용하려면 어떻게해야합니까?

+0

나는 당신이 가진 것을 정말로 이해하지 못합니다. – MBen

+0

나는 질문에 충분한 무게가 있다고 생각했다. 그 질문에 답하는 데 도움이 될만한 것이 무엇인지 놓치셨습니까? – user1280092

답변

1

모두가 왜 MVVM을 먼저 사용하는지 이해하지 못합니다. 나는 root/mainwindow와 아마도 로그인 대화 상자를 위해 먼저 뷰를 사용한다. 응용 프로그램의 나머지 부분에 대한보기/xaml에 대해 신경 쓰지 말고 Viewmodel 먼저 접근 방식을 사용하십시오. 이것은 mvvm으로 훨씬 쉽습니다. 귀하의 경우에는 mainviewmodel이 당신처럼 randomviewmodel의 목록을 처리합니다. 하지만 이제 임의의보기를 만들고 randomview 모델을 할당하는 대신에 seleced randomviewmodel을 contentpresenter에 바인딩하면됩니다. wpf는 리소스를보고 "이 randomviewmodel을 어떻게 렌더링해야합니까?"라는 데이터 템플릿을 찾고 원하는 뷰를 볼 것입니다. 뷰의 새로운 인스턴스가 생성 될 때마다 언제나 동일한 뷰 모델이 사용됩니다.

그리고 그게 내게 맞는 mvvm : 당신의 뷰를 보살펴 주면 뷰 모델을 올바르게 처리 할 수 ​​있습니다.