1

저는 크로스 플랫폼 앱을 제작하기 위해 Mvvmcross에 우수한 Mvvmcross 및 Ninja Coder를 사용하고 있습니다. 내 창고 애플 리케이션을 위해 나는 닌자 코더를 사용하여 뷰와 뷰 모델을 만들었습니다. 또한 뷰에서 참조되는 UserControl을 만들었습니다. 따라서 동일한 뷰 모델을 User 컨트롤에도 바인딩해야합니다. viewmodel의 singleton 인스턴스에 사용자 정의 컨트롤의 데이터 컨텍스트를 설정하려고했습니다. 아래처럼 사용자 정의 컨트롤의 데이터 컨텍스트를 설정했습니다.MVVMCROSS에서 UserControl에 뷰 모델을 바인딩하는 방법은 무엇입니까?

public sealed partial class SearchResultsGridViewControl : UserControl 
{ 
    private SearchresultsViewModel _viewModel; 

    public SearchResultsGridViewControl() 
    { 
     this.InitializeComponent(); 

     _viewModel = Mvx.IocConstruct<SearchresultsViewModel>(); 

     this.DataContext = _viewModel; 
    } 
} 

하지만 내 기본보기에서이 사용자 컨트롤을 참조 할 때, 그것은 말 XAML에 오류가 발생합니다 "개체 참조가 개체의 인스턴스로 설정되지 않음. SearchResultsGridViewControl의 인스턴스를 만들 수 없습니다."

내 뷰 모델입니다 :

public class SearchresultsViewModel : BaseViewModel 
{ 
    private ISearchResultsService _searchResultsService; 

    public SearchresultsViewModel(ISearchResultsService searchResultsService) 
    { 
     _searchResultsService = searchResultsService; 
     var items = _searchResultsService.DisplaySearchResults(); 
     SchoolDetails = new ObservableCollection<School>(items);    
    } 

    private ObservableCollection<School> _schoolDetails; 

    public ObservableCollection<School> SchoolDetails 
    { 
     get { return _schoolDetails; } 
     set 
     { 
      _schoolDetails = value; 
      RaisePropertyChanged(() => SchoolDetails); 
     } 
    } 

    public ICommand RefineCommand 
    { 
     get 
     { 
      refineCommand = refineCommand ?? new MvxCommand(FilterSearchResultsBasedOnRefine); 
      return refineCommand; 
     } 
    } 

    public void FilterSearchResultsBasedOnRefine() 
    {   
     SchoolDetails = new ObservableCollection<School>(_searchResultsService.FilterSchoolsBasedOnRefine(MidDayMeals, PlayGround, DigitalClassroom, DayBoarding, TransportationFacility)); 
    } 
} 

는 처음으로로드 할 때 내 UserControl을에서 그리드보기가 채워지고 있습니다. 그러나 주 뷰에서 컬렉션을 업데이트하기 위해 RefineCommand를 호출하면 usercontrol의 모눈 뷰가 업데이트되지 않습니다. 그리고 이전에 그 오류로 인해 모델을보기 위해 사용자 정의 컨트롤의 데이터 컨텍스트를 설정하는 것으로 추측하고 있습니다. 무엇이 잘못 될 수 있는지 알려주세요. 나는 며칠 동안 머리를 두드렸다.

답변

4

저는 최근 Windows Store에서 MVVMCross를 사용하고 있습니다. 내 코드를 다시 보지 않고도 데이터 인터페이스가 재정의되지 않으면 부모로부터 상속받을 것이라고 확신합니다.

사용자가 제공 한 MvxPage에 뷰 모델이있는 경우 XAML 또는 코드 숨김에서 추가 한 사용자 정의 컨트롤은 동일한 데이터 컨텍스트를 공유해야합니다. 사용자 정의 컨트롤에서 MVVMCross 데이터 바인딩을 수행하려는 경우 사용자 정의 컨트롤이 IMvxStoreView를 구현하고 ViewModel 속성이 DataContext의 값으로 설정되어 있는지 확인해야합니다.

도움이 되길 바랍니다.

건배, 트리스탄

1

나는 첫 번째 문제는 디자인 타임에만 문제가있다 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다"생각 - 당신이 디자인 타임에 Mvx.를 사용하여 뷰 모델을 설정하려고하기 때문이다. 디자인 타임 뷰 모델을 사용하고 가능한 경우 디자인 타임 도우미 중 하나 (https://github.com/MvvmCross/MvvmCross/blob/v3.1/CrossCore/Cirrious.CrossCore.Wpf/Platform/MvxDesignTimeHelper.cs 참조)를 사용하여이 문제를 해결할 수도 있습니다.


나는했습니다 두 번째 문제는 내 UserControl을에서 그리드 뷰의는 처음으로로드 할 때. 그러나 RefineCommand 기본보기에서 컬렉션을 업데이트하기 위해 호출 될 때 채워지고 "무엇 아무 생각이 없다 사용자 정의 컨트롤의 그리드보기가 업데이트되지 않습니다. "- 이것은 xaml이나 FilterSearchResultsBasedOnRefine에서 반환 된 결과와 같은 문제로 들립니다. 현재의 세부적인 수준에서 나는 그것이 무엇인지를 볼 수 없습니다. 내 "직감"은 문제가 MvvmCross에만 국한되지 않는다는 것입니다. 일반적인 Mvvm/데이터 바인딩 문제 일뿐입니다.

관련 문제