Xamarin MVVM Привязка данных не обновляется - PullRequest
0 голосов
/ 19 февраля 2019

Я борюсь с привязкой данных mvvm.Я не использую фреймворк для mvvm, у меня есть базовый базовый класс для моделей представлений.Я загрузил пример приложения с моей проблемой в GitHub, найдите ссылку ниже.

Моя проблема:

У меня есть простое приложение с меню вкладок.Есть 2 вкладки, называемые «TabA» и «TabB».Оба представления имеют простую модель представления.Модели представлений ссылаются на класс менеджера, который содержит данные.Класс Manager имеет объекты (объекты моего класса данных, который просто содержит строку и реализует INotifyPropertyChanged) в наблюдаемой коллекции.В диспетчере также есть свойство, которое ссылается на текущий выбранный объект (это только один из 2 объектов из списка).

"TabB" может выполнять 2 действия.Первый работает как положено.Если вы вводите новую строку в запись, нажимая первую кнопку, она обновляет строку текущего выбранного объекта и обновляет метку в TabA.

Что не работает?Со второй кнопкой в ​​моем классе «TabB» вы переключаете значение текущего выбранного объекта в диспетчере.В отладчике я вижу, что значение изменилось, но метка в «TabA» не распознает, что она должна обновить значение.

Можете ли вы помочь мне?

https://github.com/dercdev/MVVM-Xamarin

С помощью Джейсона я получил что-то вроде этого:

В моем TabAViewModel я подписался наСобытие менеджера:

    public TabAViewModel()
    {
        _mgr = Manager.Instance;
        _mgr.PropertyChanged += new PropertyChangedEventHandler(obj_PropertyChanged);
    }

Затем я поднимаю событие:

private void obj_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged("CurrentData");
    }

, которое обновляет метку представления.

Это нормально или есть "лучший" способ сделать это?

1 Ответ

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

Насколько я знаю, лучше использовать INotifyPropertyChanged.Если вы хотите реализовать Notify, я думаю, что вам нужно реализовать интерфейс INotifyPropertyChanged, вы можете создать одно имя класса ViewModelBase, которое наследует INotifyPropertyChanged, например:

public class ViewModelBase:INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;


    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Затем вы можете вызвать метод RaisePropertyChanged, чтобы inotify при изменении свойства,

  private string _text;

    public string Text
    {
        get
        {
            return _text;
        }
        set
        {
            _text = value;
            RaisePropertyChanged("Text");

        }
    }

ObservableCollection реализует INotifyPropertyChanged, позволяя коллекции уведомлять пользователя, когда содержимое коллекции изменилось - и, в частности, что изменилось в коллекции.Например, если вы добавляете элемент в коллекцию, событие CollectionChanged будет вызываться со свойствами, которые сообщают вам индекс нового элемента, а также включение элемента в список.Так что ObservableCollection _list не нужно вызывать метод RaisePropertyChanged.

https://docs.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.observablecollection-1.system-componentmodel-inotifypropertychanged-propertychanged?view=netframework-4.7.2

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