Привязка данных не обновлена ​​в Xamarin (WPF) - PullRequest
0 голосов
/ 14 февраля 2019

У меня возникли проблемы с привязкой данных при использовании 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

1 Ответ

0 голосов
/ 14 февраля 2019

От вашей второй модели представления вам необходимо «уведомить» первую модель представления об изменении данных.Один из способов сделать это - использовать Messenger (MvvmLight имеет такой же, как и MvvmCross).Затем вы можете использовать программу обмена сообщениями из вашего менеджера, чтобы уведомить все модели представления, которым требуется информация, о том, что CurrentT изменился.

В подписке на мессенджеры в ваших viewmodels просто вызовите RaiseNotifyPropertyChanged вашей собственности, и вы должны быть готовы пойти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...