UWP MVVM Light Gridview триггеры выбранного элемента со старыми значениями

#c# #uwp #mvvm-light

#c# #uwp #mvvm-light

Вопрос:

У меня есть gridview с привязкой SelectedItem к моей viewmodel:

 <GridView  x:Name="Patients"
               Grid.Row="1"
               ItemsSource="{x:Bind ViewModel.Patients}"
               SelectedItem="{x:Bind ViewModel.SelectedPatient, Mode=Twoway, UpdateSourceTrigger=PropertyChanged}">
        <GridView.ItemsPanel>
            <ItemsPanelTemplate>
                <ItemsStackPanel Margin="14,0,0,0" Orientation="Vertical" />
            </ItemsPanelTemplate>
        </GridView.ItemsPanel>
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="datamodel:Patient">
                <TextBlock Text="{x:Bind Name}"
                                   FontWeight="Medium"
                                   TextWrapping="NoWrap"
                                   HorizontalAlignment="Left">
                </TextBlock>
            </DataTemplate>
        </GridView.ItemTemplate>
</GridView>
  

Кажется, что все это работает 1 раз, но когда я перемещаюсь в сторону и обратно и нажимаю элемент, этот элемент перезаписывается пустым объектом. Установщик в моем свойстве вызывается 4 раза, я пытался найти проблему с трассировкой стека, но он продолжает выдавать внешний код.

Это моя ViewModel:

     public RelayCommand GoToEditPatientCommand { get; set; }
    public RelayCommand GoToInfoPatientCommand { get; set; }

    //PROPERTIES
    public static NavigationServiceEx NavigationService => ViewModelLocator.Current.NavigationService;

    private ObservableCollection<Patient> _patients;

    public ObservableCollection<Patient> Patients {
        get { return _patients = (_patients ?? new ObservableCollection<Patient>()); }
        set { _patients = value; RaisePropertyChanged("Patients"); }
    }

    private Patient _selectedPatient;

    public Patient SelectedPatient {
        get { return _selectedPatient = (_selectedPatient ?? new Patient()); }
        set
        {
            if (_selectedPatient != value)
            {
                _selectedPatient = value;
                RaisePropertyChanged("SelectedPatient");
            }
        }
    }

    //CONSTRUCTOR
    public PatientsViewModel()
    {
        GoToAddPatientCommand = new RelayCommand(() => NavigationService.Navigate("PatientApp.UWP.ViewModels.AddPatientViewModel"));
        GoToEditPatientCommand = new RelayCommand(() =>
        {
            if (SelectedPatient.Name != null)
            {
                NavigationService.Navigate("PatientApp.UWP.ViewModels.EditPatientViewModel", SelectedPatient);
                SelectedPatient = new Patient();
            }
        });
        GoToInfoPatientCommand = new RelayCommand(() =>
        {
            if (SelectedPatient.Name != null)
            {
                NavigationService.Navigate("PatientApp.UWP.ViewModels.InfoPatientViewModel", SelectedPatient);
                SelectedPatient = new Patient();
            }
        });
    }
  

Комментарии:

1. Что, если вы вернете фактическое значение _selectedPatient из вашего Patient свойства: get { return _selectedPatient; } ?

Ответ №1:

Кажется, что все это работает 1 раз, но когда я перемещаюсь в сторону и обратно и нажимаю элемент, этот элемент перезаписывается пустым объектом.

Пожалуйста, проверьте GoToEditPatientCommand метод, после перехода на новую страницу SelectedPatient был установлен новый экземпляр. Это сделает SelectedPatient пустой. Пожалуйста, попробуйте удалить SelectedPatient = new Patient(); .

 GoToEditPatientCommand = new RelayCommand(() =>
{
    if (SelectedPatient.Name != null)
    {
       NavigationService.Navigate("PatientApp.UWP.ViewModels.EditPatientViewModel", SelectedPatient);
      // SelectedPatient = new Patient();
    }
});