#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();
}
});