.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}/>

Я сейчас не чувствую себя слишком умным.

0 ответов

Другие вопросы по тегам