【问题标题】:How to access list in ViewModel from different ViewModel如何从不同的 ViewModel 访问 ViewModel 中的列表
【发布时间】:2022-02-02 03:43:21
【问题描述】:

当我从我的逻辑中加载了一些列表并想使用不同的视图模型从该列表中选择一些值时,我遇到了一些问题。

public List<ContactsListModel> ExampleList
{
    get => _exampleList;
    set
    {
        _exampleList = value;
        PropertyChanged(this, new PropertyChangedEventArgs(nameof(ExampleList)));
    }
}

上面有我的列表,其中包含一些数据。我不想再次加载它。如何在不同的 viewModel 中从中获取值?

【问题讨论】:

  • 为什么在这种情况下使用两个视图模型会是更好的问题?你有不同的看法吗?请帮助我们更好地了解您的问题,谢谢
  • 是的,我有单独的视图,有两个视图模型的 2 个页面,在一个视图模型中我有值列表,然后我想在其他视图模型中从这个视图模型中获取一些信息跨度>
  • 您的意思是在导航时将数据传递给 ViewModel 吗?
  • 我的意思是,从另一个 ViewModel 获取已经加载的数据,但在导航时不会。想象一下,我在 TabbedPage 内有 2 个页面(也许这很重要),其中一个我有数据,我需要从 Tabbed 页面内的另一个页面访问这些数据以搜索此特定列表中的某些值,感谢您的关注,我正在使用MVVM 所以逻辑是在 ViewModels 中完成的。

标签: xamarin xamarin.forms


【解决方案1】:

我把东西放在一个基类中,然后从基类继承,继承 List。 我是 Xamarin 的新手,所以不确定这是否推荐?

   public IDataStore<Item> DataStore => 
   DependencyService.Get<IDataStore<Item>>();
    public ObservableCollection<Item> Items { get; }

    bool isBusy = false;

    public BaseViewModel()
    {
        Items = new ObservableCollection<Item>();
    }

【讨论】:

    【解决方案2】:

    您可以将视图模型的实例传递到要使用它的页面,从那里您可以访问它。

    1。 您要访问的 Viewmodel:

    Pushasync(new YourPage(this));  //Passed the instance of your view model
    

    2。 您要访问的页面:

    public partial class DemoClass
    {
        YourViewModel demo_;
    
        public DemoClass()
        {
            InitializeComponent();
        }
    
        public DemoClass(Yourviewmodel demo)
        {
            InitializeComponent();
            demo_ = demo;  // access the instance and all its properties
        }
    }
    

    【讨论】:

    • 有什么办法只通过列表吗?
    • 只需更改您希望传递的构造函数参数的 YourViewModel 类型。可以传递任何类型。如果您的项目将变得复杂。使用 MVVM 框架,如 Prism、MVVMCross 等。
    • 是的,@SzymonRożek 您可以传递列表,并在您要访问的页面上使用其声明的数据类型,如上所述
    【解决方案3】:

    最简单的方法是将视图模型实例传递给需要的视图。但是,最好的方法是使用任何 MVVM 模式并使用容器注册您的实例。

    我正在使用 MVVM Light,并且有一个选项可以在那里使用 SimpleIoc 容器。只需注册您的 ViewModel 并在任何需要的地方获取您的 ViewModel 的唯一实例。

    我在一个名为 ViewModelLocator 的类中注册了我的 ViewModel,如下所示。

    public LoginViewModel LoginVM
    {
        get
        {
            if (!SimpleIoc.Default.IsRegistered<LoginViewModel>())
            {
                SimpleIoc.Default.Register<LoginViewModel>();
            }
            return SimpleIoc.Default.GetInstance<LoginViewModel>();
        }
    } 
    

    我的 App.cs 中有一个名为 Locator 的属性,如下所示。

    public static ViewModelLocator Locator
    {
        get { return _locator ?? (_locator = new ViewModelLocator()); }
    }
    

    所以现在需要的任何地方,我都可以访问 ViewModel,如下所示。

    App.Locator.LoginVM.[PropertyName] = [values to assign];
    

    【讨论】:

    • @Szymon:如果我的回复对您有帮助,请记得将我的回复标记为答案。谢谢...
    猜你喜欢
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    相关资源
    最近更新 更多