FreshMVVM доступа PageModel из кода страницы позади
Я использую формы xamarin с фреймворком freshmvvm.
Я хотел бы знать, как я могу пропустить, используя xaml, и просто получить доступ к данным привязки из кода в C#.
Есть ли примеры кода, которые могут помочь?
2 ответа
Хотя это идет вразрез с принципами MVVM, конечно, есть способ сделать это.
Без инфраструктуры MVVM вы просто создадите ViewModel вручную и установите BindingContext
( документация) самостоятельно. Единственное (в этом отношении), что 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!
Мне показался полезным ответ Джеральда, но я обнаружил, что вам нужно переопределить это событие на своей странице, вместо того, чтобы делать как в конструкторе:
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
var pageModel = BindingContext as YourFreshMVVMPageModel;
// Modify the page based on the pageModel
}
Конструкция PageModel, кажется, имеет место после Конструктора страницы, и это Событие, кажется, срабатывает в нужное время и все еще заставляет страницу делать то, что вы хотите.