Связывание источника элементов списка WPF MVVM со списком в свойстве класса

У меня есть страница с двумя частями: Listview с источником элементов, привязанным к классу ObservableCollection «Пациенты», загруженным с классом «Пациент». Под списком находятся текстовые поля, привязанные к выбранному пациенту. Все работает без написания кода на странице, кроме selection_changed для прокрутки к выбранному элементу.

Второй просмотр списка должен отображать подробности «Посещения» от выбранного «Пациента».

Приложение работает в MVVM Framework с моделью просмотра, содержащей свойства страницы.

Проблема в том, чтобы установить связь между двумя ListView. Я попробовал сначала создать второй список «Посещения» в событии NotifyPropertyChanged:

            if (Patient.ID > 0)
            {
                LoadVisite(Patient.ID); // fill the details list "Visites"
                NotifyPropertyChanged("Visites");

            }

При выборе «Пациент» задержка не отображается.

Я попробовал другое решение, вставив список деталей в мастер-класс «Пациент вот так:

    public Class Patient
    ...
    public ObservableCollection<ClsVisite> Visites
    {
        get
        {
            return _visites;
        }
        set
        {
            _visites = value;
        }
    }
            // WDABase class to open the database and load data connection 
            WDABase wd = new WDABase();
            wd.LoadListeVisites(ID, _visites); //ID is the relation beween the two tables


        }

    }

Теперь я пытаюсь создать источник деталей Listview в XAML следующим образом:

     <ListView Name="ListeVisites" ItemsSource="{Binding Path=Patient.Visites}" SelectedItem="{Binding Visite}">

Никаких подробностей не показано.

Уникальное решение, которое я нашел, заключалось в том, чтобы добавить некоторый код в событие selection_changed главного Listview, как это (в этом случае списки находятся в двух разных фреймах):

    private void ListePatients_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        ListePatients.ScrollIntoView(ListePatients.SelectedItem);
        if(ListePatients.SelectedItem != null)
        {
            var w1 = ((System.Windows.FrameworkElement)App.Current.MainWindow.Content).Parent;
            Frame pageVisite = (w1 as MainWindow).Visit;
            var w2 = (System.Windows.FrameworkElement)pageVisite.Content;
            ListView Lv = (w2 as Visite).ListeVisites;
            Lv.ItemsSource = (ListePatients.SelectedItem as ClsPatient).Visites; 

        }

    }

И это работает, но есть ли еще одно элегантное решение для привязки источника элементов к списку деталей? Спасибо за помощь. Жан-Мари


person Jean-Marie Polain    schedule 01.02.2020    source источник


Ответы (1)


Я нашел решение своей проблемы.

Причина, по которой подробности не были отображены, заключается в том, что фрейм, используемый для просмотра списка, не является общим с основным фреймом. Я обнаружил, что когда я показываю фрейм деталей, объект «Пациент» содержит только ноль. Я не знаю почему, но я читал о совместном использовании ViewModel, и теперь я использую общий в App.xaml, и мне не нужно указывать источник элементов для подробностей Listview в коде. Я вставляю XAML itemsource = {Binding Patient.Visites}, и все работает.

person Jean-Marie Polain    schedule 03.02.2020