EventHandler null из-за множественных экземпляров - PullRequest
1 голос
/ 27 июня 2019

Мой проект следует шаблону MVVM.Что мне нужно сделать, это изменить представление, когда ObservableCollection изменяется в модели.Для этого я хотел использовать eventHandler в модели и установить слушатель в ViewModel.

Моя проблема в том, что мой класс viewModel создается только один раз (когда мы впервые обращаемся к соответствующему представлению).Но мой класс модели может быть восстановлен в зависимости от потребностей пользователя.Так что все работает хорошо, пока пользователь не запускает создание нового класса модели.Но после этого мой обработчик событий переустанавливается на ноль, и так как моя ViewModel не создается, я не подписываюсь на него повторно.Поэтому он остается нулевым, и моя viewModel перестает знать о состоянии модели.

В настоящее время я заставляю представление обновляться, отправляя сообщение в viewModel каждый раз, когда пользователь обращается к нему.(С помощью кода позади onNavigatedTo ()) Но это не оптимально, поскольку модель, возможно, не изменилась, и, тем не менее, я все пересчитываю.

Я хотел бы знать, есть ли лучший способ сделать это?Например, наличие статического eventHandler (пробовал, но не смог заставить его работать) или возможность установить прослушиватель в классе ViewModel из конструктора de configprojet.

Мой класс в моей модели, который использует eventHandler.EventHandler ListeValidationCollectionChanged вызывается изменением одного из двух моих ObservableCollection.

public class ConfigProjet : NotifyPropertyChanged
{
    public event EventHandler ListeRapportschanged;
    public event EventHandler ListeFicheschanged;

    public event NotifyCollectionChangedEventHandler ListeValidationCollectionChanged;

    public ConfigProjet()
    { }

    private void Validation_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        RaiseValidationCollectionChanged(e);
    }


    private void RaiseValidationCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        if (ListeValidationCollectionChanged != null)
        {
            ListeValidationCollectionChanged(this, e);
        }
    }

    private void RaiseValidationChanged()
    {
        if (ListeRapportschanged != null)
        {
            ListeRapportschanged(this, EventArgs.Empty);
        }
        else if (ListeFicheschanged != null)
        {
            ListeFicheschanged(this, EventArgs.Empty);
        }
    }

    private ObservableCollection<string> listeFichesAValider;
    public ObservableCollection<string> ListeFichesAValider
    {
        get { return this.listeFichesAValider; }
        set
        {
            if (this.listeFichesAValider != value)
            {
                if (listeFichesAValider != null)
                {
                    //Desabonneemnt
                    listeFichesAValider.CollectionChanged -= Validation_CollectionChanged;
                }

                this.listeFichesAValider = value;
                OnPropertyChanged("ListeFichesAValider");

                if (listeFichesAValider != null)
                {
                    //abonnement
                    listeFichesAValider.CollectionChanged += Validation_CollectionChanged;
                }

                RaiseValidationChanged();
            }
        }
    }

    private ObservableCollection<string> listeRapportsAValider;
    public ObservableCollection<string> ListeRapportsAValider
    {
        get { return this.listeRapportsAValider; }
        set
        {
            if (this.listeRapportsAValider != value)
            {
                if (listeRapportsAValider != null)
                {
                    //Desabonneemnt
                    listeRapportsAValider.CollectionChanged -= Validation_CollectionChanged;
                }

                this.listeRapportsAValider = value;
                OnPropertyChanged("ListeRapportsAValider");

                if (listeRapportsAValider != null)
                {
                    //abonnement
                    listeRapportsAValider.CollectionChanged += Validation_CollectionChanged;
                }

                RaiseValidationChanged();
            }
        }
    }

и моего класса viewModel:

public class ProjetsWorkFlowVueModele : NotifyPropertyChanged
{
    public ProjetsWorkFlowVueModele()
    {            
        //used to by-pass my problem, message send by the code-behind on navigationTo event :
        Messenger.Default.Register<ListeFichiersAValiderChangedMessage>(this, OnListeFichiersAValiderChanged);

        Donnees.Instance.ConfigP.ListeFicheschanged += ConfigP_ListeFicheChanged;
        Donnees.Instance.ConfigP.ListeRapportschanged += ConfigP_ListeRapportChanged;
        Donnees.Instance.ConfigP.ListeValidationCollectionChanged += ConfigP_ListeValidationCollectionChanged;

        CreerListeFiche();
        CreerListeRapport();
    }

    private void OnListeFichiersAValiderChanged(ListeFichiersAValiderChangedMessage obj)
    {
        //on rafraichit les listes
        CreerListeFiche();
        CreerListeRapport();
    }

    private void ConfigP_ListeRapportChanged(object sender, EventArgs e)
    {
        CreerListeRapport();
    }

    private void ConfigP_ListeFicheChanged(object sender, EventArgs e)
    {
        CreerListeFiche();
    }

    private void ConfigP_ListeValidationCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        CreerListeFiche();
        CreerListeRapport();
    }
}

Редактировать 1:

Используемые мной термины Model, view и viewModel относятся к шаблону реализации MVVM.Идея состоит в том, чтобы отделить представление (логика Ui + Ui) от модели (данные + бизнес-логика), используя модель представления между ними.Таким образом, вся логика представления, данные для представления и состояния вычисляются в viewModel.Это означает, что в коде позади представления должно быть как можно меньше логики.В MVVM dataContext представления установлен в viewModel.Затем вы привязываете элементы представления к элементам viewModel.ViewModel может использовать свои собственные данные для привязки или может представлять данные из модели (в этом случае класс должен поддерживать привязку данных) к представлению.Модель может взаимодействовать через INotifyProperty / CollectionChanged (поэтому представление или viewModel знают о любых изменениях).

У меня есть два проекта: один для модели, а другой - для представления viewModel +.Первый проект (модель) не имеет никакого отношения ко второму.Однако второй может получить доступ к полям модели.

Мне было не очень понятно, когда я говорил о своей модели, представлении и т. Д., Поскольку несколько классов моделей делают разные вещи и так далее.В моем случае в моей модели есть класс, который представляет данные проекта.Поэтому он воссоздается, когда пользователь переходит из одного проекта в другой (команда запускается из пользовательского интерфейса и обрабатывается соответствующим viewModel (поднимает OnpropertyChanged), а затем в одном классе моей модели (реагирует на OnPropertyChanged) Iсоздайте новый экземпляр другого класса модели: configProjet).Поэтому проблема в том, что я создаю несколько экземпляров класса модели configProjet, но только один из моего класса viewmodel.Мой eventHandler (в моем классе модели) является экземпляром, но не слушателем (в классе viewModel).Так что eventHandler остается нулевым, потому что ни один слушатель не подписывается на него.

Надеюсь, я был ясен: x

Я извиняюсь за свой английский, так как я не являюсь носителем языка.

Спасибо за вашу помощь!

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