【问题标题】:Xamarin MVVM push user data to viewmodelXamarin MVVM 将用户数据推送到视图模型
【发布时间】:2018-04-22 11:40:39
【问题描述】:

正如标题所说,我想通过用户信息将用户信息提供给我的视图模型,但问题是视图模型已注册为依赖项,并且我将其内容绑定到 xaml 页面本身。如何将用户信息发送到视图模型本身? 谢谢!

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
        }
    }

【问题讨论】:

  • 是您在日历页面的构造函数中收到的要传递给 Viewmodel 的 User 对象吗?

标签: xaml xamarin mvvm dependency-injection xamarin.forms


【解决方案1】:

我想对@LeRoy 发表评论(没有足够的声誉),使用一个框架。我会推荐 FreshMVVM,您可以将对象传递到 ViewModel 甚至传递服务。它使一切变得干净整洁,而且效果很好。

【讨论】:

  • 是的,我开始使用一个框架,我所有的正常问题都得到了解决。谢谢!
【解决方案2】:

您的 CalendarViewModel 视图模型不应该包含 BindableBase 吗?

public class CalendarViewModel : BindableBase, ViewModelBase, ICalendarViewModel

你使用什么框架?棱镜,freshmvvm。

您的视图和视图模型通常由框架自动处理,您只需注册您的页面。

Container.RegisterTypeForNavigation<Views.CalendarPage>();

【讨论】:

  • 在 C# 中不能有两个基类。
  • 我目前没有使用框架,我使用 Autofac 作为引导类中 IContainer 的 nuget 包。通过引导类,我注册了依赖项,这段代码的工作方式与@LeRoy 一样
  • @BrianM 所以问题与将服务传递给您的 ViewModel 有关吗?
猜你喜欢
  • 1970-01-01
  • 2019-01-03
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多