У меня возникли проблемы с привязкой данных при использовании MVVM в Xamarin. Позвольте мне объяснить мою архитектуру:
У меня есть класс-менеджер, который содержит ObservableCollection с классами типа t, t — мой модельный класс. Класс Manager также содержит атрибут с именем activeT, который является текущим выбранным объектом моего класса модели. Есть 2 интерфейса, один из которых показывает текущие данные t. ViewModel привязан к атрибуту t моего класса Manager следующим образом:
public t CurrentT
{
get
{
return _mgr.CurrentT;
}
set
{
_mgr.CurrentT = value;
OnPropertyChanged();
}
}
_mgr — это мой синглтон-менеджер-объект.
Теперь есть другое представление, которое может выбрать текущий t из выпадающего списка. ViewModel этого представления привязан к ObservableCollection менеджера. Если я изменяю выбранный объект, я делаю это с тем же кодом, что и выше. Свойством менеджера является следующий код:
public t CurrentT
{
get
{
return _currentT;
}
set
{
_currentT= value;
OnPropertyChanged());
}
}
Проблема в том, что первое представление для просмотра текущего выбранного t не обновляется, хотя я вижу в отладчике, что текущий t изменен другим представлением.
Кто-нибудь может мне помочь?
Редактировать:
Я предоставляю еще немного кода:
Менеджер-класс:
public class Manager : INotifyPropertyChanged
{
private t _currentConstructionSite;
private ObservableCollection<t> _constructionSites = null;
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string name)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(name));
}
public t CurrentConstructionSite
{
get
{
return _currentConstructionSite;
}
set
{
_currentConstructionSite = value;
OnPropertyChanged("CurrentConstructionSite");
}
}
public ObservableCollection<t> ConstructionSites
{
get
{
return _constructionSites;
}
set
{
_constructionSites = value;
}
}
private Manager()
{
ConstructionSites = DataRepository.GenConstructionSites();
_currentConstructionSite = ConstructionSites[0];
}
}
ViewModels Class A (это модель представления, которая показывает некоторые данные):
public class DashboardViewModel : ViewModelBase
{
private Manager _mgr;
public t CurrentConstructionSite
{
get
{
return _mgr.CurrentConstructionSite;
}
set
{
_mgr.CurrentConstructionSite = value;
OnPropertyChanged();
}
}
public DashboardViewModel()
{
_mgr = Manager.getInstance();
}
}
Представление A для отображения некоторых данных:
Настройка привязки из XAML:
<ContentPage.BindingContext>
<local:DashboardViewModel x:Name = "viewModel"/>
</ContentPage.BindingContext>
Привязка метки для отображения данных:
<Label Text = "{Binding CurrentConstructionSite.ConstructionSiteName, Mode=TwoWay}" HorizontalOptions = "Center" Font = "Bold" FontSize = "Large"/>
ViewModel B для выбора текущего t:
public class ChooseConstructionSiteViewModel : ViewModelBase
{
Manager _mgr = null;
public ObservableCollection<t> ConstructionSites
{
get
{
return _mgr.ConstructionSites;
}
}
public t CurrentConstructionSite
{
get
{
return _mgr.CurrentConstructionSite;
}
set
{
_mgr.CurrentConstructionSite = value;
OnPropertyChanged();
}
}
public ChooseConstructionSiteViewModel()
{
_mgr = Manager.getInstance();
}
}
Представление для выбора текущего t:
<combobox:SfComboBox x:Name = "combobox" Grid.Row = "0" Grid.Column = "1" Margin = "8,0,20,0" VerticalOptions = "Center" HeightRequest = "40" DataSource = "{Binding ConstructionSites}" DisplayMemberPath = "ConstructionSiteName" SelectionChanged = "Handle_SelectionChanged"/>
И если выбор из выпадающего списка изменился:
void Handle_SelectionChanged(object sender, Syncfusion.XForms.ComboBox.SelectionChangedEventArgs e)
{
t selectedItem = e.Value as t;
_viewModel.CurrentConstructionSite = selectedItem;
}
Два представления содержатся как contetPages в tabbedPage. В целом это работает, но изменение выбранного t в представлении B не обновляет данные в представлении A. Я вижу в отладчике, что значение t изменяется через представление B, но когда я возвращаюсь к представлению A, появляется старое значение. В отладчике я вижу, что значение обновляется.
Кстати: ViewModelBase — это класс, реализующий INotifyPropertyChanged.
я редактирую свой пост.





Из вашей второй модели представления вам нужно «уведомить» первую модель представления об изменении данных. Один из способов сделать это — использовать мессенджер (у MvvmLight он есть, как и у MvvmCross). Затем вы можете использовать мессенджер от своего менеджера, чтобы уведомить все модели просмотра, которым нужна информация об изменении CurrentT.
В подписке на мессенджер в ваших моделях просмотра просто вызовите RaiseNotifyPropertyChanged вашего свойства, и все будет готово.
Как я могу поднять это вручную без каких-либо фреймворков, таких как MvvmLight или MvvmCross?
Подняв событие NotifyPropertyChanged, которое вы где-то реализовали
Вам необходимо предоставить более подробную информацию. Вы реализуете интерфейс
INotifyPropertyChanged? Как вы устанавливаетеDataContext?