【问题标题】:Send data from ViewModel to ViewModel and showing on ViewPages将数据从 ViewModel 发送到 ViewModel 并在 ViewPages 上显示
【发布时间】:2021-08-01 17:12:24
【问题描述】:

我有两个 Views,Coffee 和 Doppio 咖啡(可能是任何咖啡)。 CoffeeView 是可用咖啡的列表,当一个 Coffee 被录音时,它会打开它的详细信息页面(在这个例子中,Doppio 已经点击了)。 我有两个 ViewModel,分别是 CoffeViewModel 和 CoffeeDetailsViewModel。

我可以实现这个场景,但不能 MVVMify。我知道路由。我可以在路由上传递变量,但不能在 ViewModel 之间传递。见下图。当我点击 Coffee 上的特定项目时,我希望它将其数据从 CoffeeViewModel 发送到其 CoffeeDetailsViewModel,同时打开其 DetailsViewPage 并在该页面上显示数据。

 await Navigation.PushAsync(new CoffeeDetailsPage(family));

await Shell.Current.GoToAsync($"{nameof(CoffeeDetialsPage)}?Data={Data}"); 

我使用了上面的路由语法,但是它可以将数据发布到 CoffeeDetails.XAML.cs 而不是它的 ViewModel,当我想向它的 ViewModel 发送数据时,它不会启动它的页面。

更新

ViewModel 使用以下语法在 Xaml 中实例化。

 <ContentPage.BindingContext>
    <ViewModel:CoffeeViewModel></ViewModel:CoffeeViewModel>
  </ContentPage.BindingContext>

【问题讨论】:

  • CoffeeDetailsPage 应该使用该参数来创建它的虚拟机。或者还有其他支持直接在 VM 之间导航的 MVVM 框架。
  • @Jason 你能解释一下如何使用这个参数来创建 ViewModel 吗?
  • 在您的第一个示例中,您将family 传递给CoffeeDetailsPage,因此当CoffeeDetailsPage 创建它的VM 时,它可以通过VM 构造函数传递family。这是一个相当典型的使用模式
  • @Jason 但这会将family 变量传递给CoffeDetailsPage.Xaml.cs 而不是它的ViewModel
  • 为该页面创建的虚拟机在哪里?

标签: android shell xamarin.forms mvvm data-binding


【解决方案1】:

如果您在构造函数中分配虚拟机,您可以轻松地向它传递参数

public CoffeeDetailsPage(Family family)
{
    InitializeComponent();

    BindingContext = new CoffeeViewModel(family);
}

【讨论】:

  • 这个解决方案还有一个问题。 CoffeeViewModel 根据传递给此 ViewModel 的 family 变量从 Firebase 下载数据,我在那里使用了异步方法。问题在于InitializeComponent();,因为它在加载数据之前执行并引发异常。 Object reference not set to an instance of an object...
  • InitializeComponent 只是初始化 XAML。它不应该依赖于其他任何东西。您需要找出异常的根本原因并解决它——不要只对导致它的原因做出假设
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 2016-10-19
  • 2019-02-26
相关资源
最近更新 更多