У меня возникли проблемы с привязкой данных при использовании MVVM в Xamarin.Позвольте мне объяснить мою архитектуру:
У меня есть класс Manager, который содержит ObservableCollection с классами типа t, t - это мой модельный класс.Класс Manager содержит также атрибут с именем activeT, который является текущим выбранным объектом класса моей модели.Есть 2 интерфейса, один из которых показывает текущие данные t.ViewModel привязан к атрибуту t моего класса Manager следующим образом:
public t CurrentT
{
get
{
return _mgr.CurrentT;
}
set
{
_mgr.CurrentT = value;
OnPropertyChanged();
}
}
_mgr - мой одноэлементный объект Manager.
Теперь есть другое представление, которое можетвыберите текущий t из выпадающего списка.Модель представления этого представления привязана к 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