【问题标题】:freshmvvm access PageModel from Page code behindFreshmvvm 从后面的 Page 代码访问 PageModel
【发布时间】:2016-10-21 10:02:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: mvvm xamarin xamarin.forms freshmvvm


    【解决方案1】:

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

    如果没有 MVVM 框架,您只需手动创建一个 ViewModel 并自己设置BindingContext (documentation)。 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!

    【讨论】:

    • 感谢回复,对理解freshmvvm 真的很有帮助:)
    • 太棒了。简单而干净的答案。 :)
    【解决方案2】:

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

    protected override void OnBindingContextChanged()
    {
        base.OnBindingContextChanged();
    
        var pageModel = BindingContext as YourFreshMVVMPageModel;
    
        // Modify the page based on the pageModel
    }
    

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

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多