[QueryProperty("Filename", "Filename_")]
public partial class DetailsViewModel : ObservableObject
{
[ObservableProperty]
string filename;
partial void OnFilenameChanged(string value)
{
ReadFile();
}
[Relay Command]
async Task Edit(string s)
{
// filename passed as s
await Shell.Current.GoToAsync($"{"Edit"}?Filename_{s}");
}
}
Я использовал этот код, чтобы убедиться, что свойство установлено вместо вызова ReadFile() из конструктора, где Filename имеет значение null, что отлично работало в моем DetailsViewModel, но при использовании той же идеи в моем EditViewModel метод OnFilenameChanged вообще не запускается.
[QueryProperty("Filename", "Filename_")]
public partial class EditViewModel : ObservableObject
{
[ObservableProperty]
string filename;
partial void OnFilenameChanged(string value)
{
ReadFile();
}
}
Сначала я думал, что проблема в методе ReadFile(), но я поставил на него точку останова, и он никогда не вызывался, а это значит, что OnFilenameChanged тоже никогда не вызывается. Я пробовал играть с переменными, я прошел через это, и s - это имя файла, которое я хочу, чтобы оно было, когда оно передается команде Edit.





[QueryProperty("Filename", "Filename_")]
public partial class EditViewModel : ObservableObject
{
[ObservableProperty]
string filename;
partial void OnFilenameChanged(string value)
{
ReadFile();
}
}
Я думаю, что это правильный способ решить эту проблему. нет никаких проблем
Причина, по которой ваше свойство никогда не устанавливается и метод OnFilenameChanged() никогда не вызывается, заключается в том, что QueryProperty не соответствует ни одному из свойств в вашей EditViewModel.
Проблема конкретно в этой строке:
await Shell.Current.GoToAsync($"{"Edit"}?Filename_{s}");
Обратите внимание, что вам не хватает символа =. Должен быть
await Shell.Current.GoToAsync($"{"Edit"}?Filename_ = {s}");
Также обратите внимание, что будет передано только значение s, аргумент не будет включать в себя Filename_.
Как правило, я бы рекомендовал не использовать подчеркивание (_) и заменить QueryProperty на это:
[QueryProperty(nameof(Filename), nameof(Filename))]
public partial class EditViewModel : ObservableObject
{
[ObservableProperty]
string filename;
partial void OnFilenameChanged(string value)
{
ReadFile();
}
}
Тогда назовите это так, например:
await Shell.Current.GoToAsync($"/Edit?Filename = {s}");
Спасибо большое, это был знак равенства. Я знал, что это будет что-то маленькое, что я пропустил, но просто не мог этого увидеть!
ObservablePropertyработает не так. Он вызывает событиеPropertyChanged, а не создает отдельные события для каждого свойства. См. документацию