2017-11-09 7 views
1

제목과 같이 사용자 정보를 통해 내 viewmodel에 제공하고 싶지만 viewmodel은 종속성으로 등록되어 있으며 xaml 페이지 자체에 해당 내용을 바인딩하고 있습니다. 사용자 정보를 뷰 모델 자체로 보내려면 어떻게해야합니까? 감사합니다.Xamarin MVVM은 viewmodel에 사용자 데이터를 푸시

Xaml.cs 부분 :

[XamlCompilation(XamlCompilationOptions.Compile)] 
    public partial class Calendar : ContentPage 
    { 
     public Calendar(User user) 
     { 
      InitializeComponent();    
      FileImageSource image = new FileImageSource 
      { 
       File = "calendar.png" 
      };   
      Icon = image;// push user information to the ICalendarViewModel 
      BindingContext = AppContainer.Container.Resolve<ICalendarViewModel>(); 
     } 
    } 

인터페이스 :

public interface ICalendarViewModel : INotifyPropertyChanged 
    { 

    } 

부트 스트랩 부분 등록 종속성

public class Bootstrap 
    { 
     public IContainer CreateContainer() 
     { 
      var containerBuilder = new ContainerBuilder(); 
      RegisterDependencies(containerBuilder); 
      return containerBuilder.Build(); 
     } 


     protected virtual void RegisterDependencies(ContainerBuilder builder) 
     { 
      builder.RegisterType<CalendarViewModel>() 
       .As<ICalendarViewModel>() 
       .SingleInstance(); 


     } 
    } 

CalendarViewModel :이

도움이 될 것입니다 나도 몰라
public class CalendarViewModel : ViewModelBase, ICalendarViewModel 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     public string ErrorMessage { get; set; } 
     private CourseInformation _information; 
     private ICourseInformationRepository _repository; 

     public CalendarViewModel() 
     { 
      _repository = new CourseInformationRepository(); 
      LoadData(); 
     } 

     private ObservableCollection<CourseInformation> _courses; 
     public ObservableCollection<CourseInformation> Courses 
     { 
      get 
      { 
       return _courses; 
      } 
      set 
      { 
       _courses = value; 
       RaisePropertyChanged(nameof(Courses)); 
      } 
     } 

     private void LoadData() 
     { 
      try 


{ 
      ObservableCollection<CourseInformation> CourseList = new ObservableCollection<CourseInformation>(_repository.GetAllCourseInformation()); 
      Courses = new ObservableCollection<CourseInformation>(); 
      DateTime date;   
      foreach (var course in CourseList) 
      { 
       string [] cour = course.Date.Split('/'); 
       cour[2] = "20" + cour[2]; 
       date = new DateTime(Convert.ToInt32(cour[2]), Convert.ToInt32(cour[1]), Convert.ToInt32(cour[0])); 
       if (date == DateTime.Now)//TESTING WITH TEST DATE, datetime.now 
       { 
        if (course.FromTime.Length < 4) 
        { 
         course.FromTime = "0" + course.FromTime; 
        } 
        if (course.UntilTime.Length < 4) 
        { 
         course.UntilTime = "0" + course.UntilTime; 
        } 
        course.FromTime = course.FromTime.Insert(2, ":"); 
        course.UntilTime = course.UntilTime.Insert(2, ":"); 
        Courses.Add(course); 
       } 
      }    
     } 
     catch (ServerUnavailableException e) 
     { 
      ErrorMessage = "Server is niet beschikbaar, ophalen van kalender is niet mogelijk."; 
     } 
    } 

    private void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

부트 스트랩 App.xaml.cs를 바인딩 :

public partial class App : Application 
    { 
     public App() 
     { 
      InitializeComponent(); 
      AppContainer.Container = new Bootstrap().CreateContainer(); 
      MainPage = new LoginView();   
     } 

     protected override void OnStart() 
     { 
      // Handle when your app starts 
     } 

     protected override void OnSleep() 
     { 
      // Handle when your app sleeps 
     } 

     protected override void OnResume() 
     { 
      // Handle when your app resumes 
     } 
    } 
+0

Viewmodel에 전달할 캘린더 페이지 생성자에서 수신중인 사용자 개체입니까? –

답변

1

@LeRoy에 대해 (평판이 충분하지 않습니다.) 프레임 워크를 사용하고 싶습니다. 나는 FreshMVVM을 추천하고 당신은 ViewModel에 객체를 전달할 수 있고 심지어 서비스에서 전달할 수 있습니다. 모든 것을 멋지고 깨끗하게 만들어 주며 작동합니다.

+0

예, 프레임 워크를 사용하기 시작했으며 모든 정상적인 문제가 해결되었습니다. 고맙습니다! – BrianM

0

은 CalendarViewModel 뷰 모델은 이 포함되지 않아야 BindableBase?

public class CalendarViewModel : BindableBase, ViewModelBase, ICalendarViewModel 

어떤 프레임 워크를 사용하고 있습니까? 프리즘, freshmvvm.

귀하의보기 및보기 모델은 일반적으로 프레임 워크에 의해 자동으로 처리되므로 필요한 것은 페이지를 등록하는 것입니다.

Container.RegisterTypeForNavigation<Views.CalendarPage>(); 
+0

C#에서는 두 개의 기본 클래스를 가질 수 없습니다. –

+0

현재 프레임 워크를 사용하고 있지 않습니다. 부트 스트랩 클래스의 IContainer에 대해 Autofac을 nuget 패키지로 사용합니다. 부트 스트랩 클래스를 통해 종속성을 등록하고이 코드는 @LeRoy – BrianM

+0

@ BrianM과 같이 작동합니다. 그렇다면 질문은 ViewModel에 서비스를 전달해야합니까? – LeRoy