freshmvvm 从后面的页面代码访问 PageModel

freshmvvm access PageModel from Page code behind

我正在使用带有 freshmvvm 框架的 xamarin 表单。

我想知道如何跳过使用 xaml,而仅从 c# 中的代码隐藏访问绑定数据。

是否有任何代码示例可以提供帮助?

虽然这违背了 MVVM 的原则,但当然有办法做到。

如果没有 MVVM 框架,您只需手动创建一个 ViewModel 并自行设置 BindingContext (documentation)。 'only' MVVM 框架为您做的事情(关于这一点)设置为自动绑定,因此您不必为一遍又一遍地编写相同的代码而烦恼。

所以,假设您有这个 ViewModel,注意我使用 PageModel 来匹配 FreshMvvm 命名:

// SamplePageModel.cs
public class SamplePageModel
{
    public string Foo { get; set; } = "Bar";
}

现在在我的页面中,我这样设置 BindingContext:

// SamplePage.cs
// ... Skipped code, just constructor here:
public SamplePage()
{
    InitializeComponent();

    BindingContext = new SamplePageModel();
}

现在您可以绑定到 SamplePageModel 中的任何 属性。

FreshMvvm 自动完成这部分。 如果出于某种原因,您想直接访问 ViewModel/PageModel,只需执行相反的操作即可。您可以在页面或代码隐藏的某处执行以下操作:

// ... Some code here
var pageModel = BindingContext as SamplePageModel;
// ... More code here

现在,如果 pageModel 不是 null,那么您就有了数据绑定和填充的 PageModel!

我发现 Gerald 的回答很有帮助,但我发现您需要在页面中覆盖此事件,而不是在构造函数中执行 as

protected override void OnBindingContextChanged()
{
    base.OnBindingContextChanged();

    var pageModel = BindingContext as YourFreshMVVMPageModel;

    // Modify the page based on the pageModel
}

PageModel 构造似乎发生在页面构造函数之后,并且此事件似乎在正确的时间触发并且仍然使页面执行您想要的操作。