Я кодирую приложение Xamarin и прилагаю все усилия, чтобы придерживаться MVVM, что мне действительно очень нравится
У меня обычно есть ContentPages, содержащие ссылки на Views.
Я устанавливаю контекст привязки на ВМ на странице, а затем использовать OnBindingContextChanged в представлении
. Это позволяет мне использовать метод PropertyChanged, чтобы затем отвечать на условия отображения logi c для моего представления
. Я использовал его несколько раз успешно, но я сбит с толку, почему не работает дополнительная реализация
Страница выглядит так
public partial class BindingTextPage : ContentPage
{
public BindingTextPage()
{
InitializeComponent();
this.BindingContext = new ViewModels.LocationsViewModel();
}
}
Вид выглядит так
private LocationsViewModel_vm;
public BindingTestView()
{
InitializeComponent();
System.Diagnostics.Debug.WriteLine("Debug: Initialised BindingTesView view");
}
protected override void OnBindingContextChanged()
{
System.Diagnostics.Debug.WriteLine("Debug: BindingTest: OnBindingContextChanged: Context " + this.BindingContext.GetType());
_vm = BindingContext as LocationsViewModel;
_vm.PropertyChanged += _vm_PropertyChanged;
}
private void _vm_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
try
{
System.Diagnostics.Debug.WriteLine("Debug: BindingTest: Method called");
System.Diagnostics.Debug.WriteLine("Debug: BindingTest: Property " + e.PropertyName);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("Debug: BindingTestView: Error changing context " + ex.Message);
}
}
Извлечь модели представления, очень просто в этом случае установка строки и, следовательно, изменение свойства, которое, как я ожидал, вызвало бы срабатывание PropertyChange?
public LocationsViewModel()
{
tempMessage = "this is from the view model";
}
public string tempMessage
{
get
{
return _tempMessage;
}
set
{
_tempMessage = value;
OnPropertyChanged(nameof(tempMessage));
}
}
Мои операторы отладки при загрузке показывают, что OnBindingContextChange вызывается, но в этом случае _vm_PropertyChanged никогда не срабатывает? Я ожидаю, что tempMessage будет настроен на это?