.NET MAUI: доступ к переданному объекту невозможен до тех пор, пока не запустится XAML.
Проблема
У меня есть объект, который я передаю из ViewModel A в ViewModel B. У объекта есть свойства, используемые в XAML. Проблема в том, что у меня нет доступа к переданному объекту до тех пор, пока не запустится XAML.
Вот что я хотел бы, чтобы произошло:
Мой текущий код
Вот моя ViewModel. Обратите внимание, что этот метод является методом EventToCommandBehavior и запускается до запуска XAML. Также обратите внимание, что если я помещу код в конструктор ViewModel, я получу такое же поведение: если я поставлю точку останова в первой строкеAppearing
метод,Object.FirstName
являетсяnull
.
[QueryProperty("Object","Object")]
public partial class ViewModel: ObservableObject
{
[ObservableProperty] private Object object;
[ObservableProperty] private string firstName;
[ObservableProperty] private string lastName;
[ObservableProperty] private string someOtherString;
[RelayCommand]
private async Task Appearing()
{
FirstName = Object.FirstName;
LastName = Object.LastNamel
SomeOtherString = Object.SomeOtherString;
}
// NOTE: WE COULD USE THE CONSTRUCTOR INSTEAD OF 'APPEARING' AND
// GET THE SAME RESULTS
//public ViewModel()
//{
// FirstName = Object.FirstName;
// LastName = Object.LastNamel
// SomeOtherString = Object.SomeOtherString;
//}
Вот XAML, который НЕ заполняется:
<ContentPage>
<ContentPage.Behaviors>
<toolkit:EventToCommandBehavior Command="{Binding AppearingCommand}"
EventName="Appearing" />
<Grid>
<Label Text="{Binding FirstName}"/>
<Label Text="{Binding LastName}"/>
<Label Text="{Binding SomeOtherString}"/>
</Grid>
</ContentPage>
Объект передан правильно
В конце концов я получаю доступ к переданному объекту. Например, если я сделаю это, метки заполнятся, но уже слишком поздно. Если я поставлю точку останова над первой строкойTooLittleTooLate()
,Object.FirstNAme
заполняется переданным значением.
[QueryProperty("Object","Object")]
public partial class ViewModel: ObservableObject
{
[ObservableProperty] private Object object;
[ObservableProperty] private string firstName;
[ObservableProperty] private string lastName;
[ObservableProperty] private string someOtherString;
[RelayCommand]
private async TooLittleTooLate()
{
FirstName = Object.FirstName;
LastName = Object.LastNamel
SomeOtherString = Object.SomeOtherString;
}
}
Наряду с этим xaml:
<ContentPage>
<Grid>
<Label Text="{Binding FirstName}"/>
<Label Text="{Binding LastName}"/>
<Label Text="{Binding SomeOtherString}"/>
<Button Text="Press Me"
Command={Binding TooLittleTooLateCommand}/>
</Grid>
</ContentPage>
Когда я делаю это и пользователь нажимает кнопку, метки заполняются, но уже слишком поздно ! Мне нужно, чтобы метки были заполнены до первого запуска XAML.
Я думаю, что упускаю что-то действительно очевидное, потому что раньше я делал подобные вещи без проблем.
РЕДАКТИРОВАТЬ: Решение
Да, проблема была очевидна. Вместо того, чтобы привязываться к собственности, я должен был привязываться кObject.Property
.
Вместо этого:
Label Text={Binding FirstName}/>
Это должно было быть так:
Label Text={Binding Object.FirstName}/>
Я сейчас не чувствую себя слишком умным.