如何在Actvity使用viewmodel中替换片段

时间:2017-11-14 14:55:02

标签: c# xamarin mvvm mvvmcross viewmodel

我有Android使用Xamarin C#和MVVM Cross的问题。 程序创建主要活动,但在使用ShowViewModel(TripsViewModel)时提供异常。在trips.xml中我使用Mvx.MvxListView,因为这是一个动态列表视图。我不知道我的坏处:(我看了很多页/教程和问题。也许我不会写点什么。

错误很少。如果我修一个,它会显示下一个:/

TripsViewModel.cs

public class TripsViewModel : MvxViewModel
{
    private readonly IUserRepository _userRepository;
    private readonly ITripsRepository _tripsRepostitory;

    public TripsViewModel()
    {

    }

    private MvxObservableCollection<Trip> _searchTripsList;
    public MvxObservableCollection<Trip> SearchTripsList
    {
        get { return _searchTripsList; }
        set
        {
            _searchTripsList = value;
            RaisePropertyChanged(() => SearchTripsList);
        }
    }

    private Trip _selectedTrip;
    public Trip SelectedTrip
    {
        get { return _selectedTrip; }
        set
        {
            _selectedTrip = value;
            RaisePropertyChanged(() => SelectedTrip);
        }
    }

    public TripsViewModel(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    #endregion

    #region VM LifeCycle
    public void Init()
    {

    }

    public override void Start()
    {
        base.Start();
    }

    public void ReloadState(SavedState savedState)
    {

    }

    public SavedState SaveState()
    {
        return new SavedState() { };
    }

    public class SavedState{
        //add save state class
    }
    #endregion

}

MainViewModel.cs

public class MainViewModel : MvxViewModel
{
    private readonly Lazy<TripsViewModel> _tripsViewModel;
    public TripsViewModel TripsViewModel => _tripsViewModel.Value;

    public MainViewModel()
    {
        _tripsViewModel = new Lazy<TripsViewModel>(Mvx.IocConstruct<TripsViewModel>);
    }


    public void ShowMenu()
    {
        ShowViewModel<MenuViewModel>();
    }

    public void ShowTripsList()
    {
        ShowViewModel<TripsViewModel>();
    }

}

TripListFragment.cs

[MvxFragmentPresentationAttribute(typeof(MainViewModel), Resource.Id.content_frame, true)]
[Register("GTMS.MobileNative.Droid.Views.TripsListFragment")]
public class TripsListFragment : MvxFragment<TripsViewModel>
{

    public TripsListFragment()
    {

    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        base.OnCreateView(inflater, container, savedInstanceState);
        return this.BindingInflate(Resource.Layout.trips, container);
    }
}

MainActivity.cs

[Activity(Label = "MainActivity", MainLauncher = true)]
public class MainActivity : MvxAppCompatActivity<MainViewModel>
{
    private BottomNavigationView bottomNavigation;
    private DrawerLayout _drawerLayout;
    internal DrawerLayout DrawerLayout { get { return _drawerLayout; } }

    private FragmentManager _fragmentManager;
    static MainActivity instance = new MainActivity();
    public static MainActivity CurrentActivity => instance;

    public new MainViewModel ViewModel
    {
        get { return (MainViewModel)base.ViewModel; }
        set { base.ViewModel = value; }
    }

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.main);
        _fragmentManager = FragmentManager;

        bottomNavigation = FindViewById<BottomNavigationView>(Resource.Id.bottom_navigation);
        bottomNavigation.NavigationItemSelected += NavigationItemSelected;


        /*zmiana pomiedzy fragmentami*/
        ViewModel.ShowTripsList();
        //ViewModel.NavigateToFragment(0);
        // Create your application here
    }

    private void NavigationItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e)
    {
        Android.Support.V4.App.Fragment fragment = null;
        switch (e.Item.ItemId)
        {
            case Resource.Id.menu_home:
                ViewModel.ShowTripsList();
                break;
            case Resource.Id.menu_audio:
                //fragment = Fragment2.NewInstance();
                break;
            case Resource.Id.menu_video:
               // fragment = Fragment3.NewInstance();
                break;
        }

        if (fragment == null)
            return;


    }

0 个答案:

没有答案