freshmvvm从页面代码后面访问PageModel

时间:2016-06-20 08:20:07

标签: mvvm xamarin xamarin.forms freshmvvm

我使用xamarin表单和freshmvvm框架。

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

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

2 个答案:

答案 0 :(得分:6)

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

如果没有MVVM框架,您只需手动创建ViewModel并自己设置BindingContextdocumentation)。只有'事情(关于这一点)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!

答案 1 :(得分:3)

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

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

    var pageModel = BindingContext as YourFreshMVVMPageModel;

    // Modify the page based on the pageModel
}

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