Формы Xamarin - передать аргумент в модель представления контекста привязки, указанную в файле XAML

У меня есть файл xaml с записью. Я привязываю конкретную запись к определенной модели просмотра. Но модель просмотра ожидает навигатора. Как передать навигатор из файла xaml в модель просмотра?

     <Entry  Text="{Binding Signature, Mode=TwoWay}">
        <Entry.BindingContext>
            <vm:SignaturePopupViewModel>
                // I need to pass a navigator..

            </vm:SignaturePopupViewModel>
        </Entry.BindingContext>
    </Entry>

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

    public SignaturePopupViewModel(INavigation navigation = null)
    {
        Navigation = navigation;

        SendSignatureCommand = new Command(async () =>
        {
            await SendSignature();
            await Navigation.PopAsync();
        });
    }

person M Yil    schedule 09.03.2020    source источник
comment
Что вы имеете в виду под навигатором?   -  person Mouse On Mars    schedule 09.03.2020
comment
Модель просмотра ожидает навигации. Я использую этот объект, чтобы открыть страницу в модели просмотра, чтобы вернуться на предыдущую страницу. Я добавил код в пост.   -  person M Yil    schedule 09.03.2020


Ответы (2)


Вам не нужно использовать INavigation navigation в SignaturePopupViewModel в конструкторе для достижения навигации.

Просто используйте простой способ

await Application.Current.MainPage.Navigation.PopModalAsync(); Or

await Application.Current.MainPage.Navigation.PopAsync()

как следующий код.

   public class SignaturePopupViewModel
{

    public ICommand SendSignatureCommand { protected set; get; }
    public SignaturePopupViewModel( )
    {


        SendSignatureCommand = new Command(async () =>
        {


            await SendSignature();
            // if you use the     MainPage = new NavigationPage( new MainPage()); in 
            //App.xaml.cs use following code.
            await Application.Current.MainPage.Navigation.PopAsync();

             // if not, just use await Application.Current.MainPage.Navigation.PopModalAsync();
        });
    }
}
person Leon Lu - MSFT    schedule 10.03.2020

Не могли бы вы создать экземпляр SignaturePopupVM в ViewModel этой страницы, а затем вместо этого привязать текст к этому свойству?

VM:

SignaturePopupViewModel SignaturePopupVMInstance { get; private set; }
public ParentVM()//Constructor
{
    SignaturePopupVMInstance = new SignaturePopupViewModel(new Navigator());
}

Xaml:

     <Entry  Text="{Binding SignaturePopupVMInstance.Signature, Mode=TwoWay}"/>

Редактировать:

public class TabPageVM{
   public ChildVM TheVMForTabOne { get; set; }
   public AnotherChildVM TheVMForTabTwo { get; set; }
   public TabVM TheVMForTabThree { get; set; }

   public TabPageVM(){
      TheVMForTabOne = new ChildVM(/*parameters*/);
      TheVMForTabTwo = new AnotherChildVM(/*parameters*/);
      TheVMForTabThree = new TabVM(/*parameters*/);      
   }

}

Xaml для вкладки:

<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:Views="clr-namespace:App.ViewsForMyTabs"
             x:Class="App.TabPageView"
             BarBackgroundColor="#EEEEEE"
             BarTextColor="Black"
             BindingContext="{Binding TheTabbedPageVMInstance}">
    <TabbedPage.Children>
        <Views:TheViewForTabOne x:Name="TabOneView"
                                BindingContext="{Binding TheVMForTabOne}"/>
        <Views:TheViewForTabTwo x:Name="TabTwoView"
                                BindingContext="{Binding TheVMforTabTwo}"/>
        <Views:TheViewForTabThree x:Name="TabThreeView"
                                  BindingContext="{Binding TheVMforTabThree}"/>
    </TabbedPage.Children>
</TabbedPage>

Допустим, у TheViewForTabOne есть кнопка, которая переводит вас на новую страницу. Виртуальная машина для этого представления "TheVMForTabOne" будет иметь что-то вроде этого:

public class ChildVM{
   public SignaturePopupViewModel SignaturePopupVMInstance { get; set; }
   public Command NavigateToNewPageWithEntry { get; private set; }

   public ChildVM(){
      SignaturePopupVMInstance = new SignaturePopupViewModel(/*parameters*/);

      NavigateToNewPageWithEntry = new Command(() =>{
          //Navigate to new page with SignaturePopupVMInstance as the BindingContext
      }
   }
}

TheViewForTabOne
...
<Label Text="{Binding SignaturePopupVMInstance.Signature}"/>
<Button Command="{Binding NavigateToNewPageWithEntry}"/>
...
person Jonathan Cook    schedule 09.03.2020
comment
Но мне нужно правильно установить контекст привязки этого представления Entry? - person M Yil; 09.03.2020
comment
Файл xaml имеет несколько контекстов привязки. Вот почему мне нужно установить контекст привязки в представлении. Как я могу установить контекст привязки для конкретной записи, если можно спросить? - person M Yil; 09.03.2020
comment
Возможно, правильным вопросом будет: как я могу ссылаться на SignaturePopupVMInstance из файла xaml, чтобы представление записи могло установить контекст привязки? (Страница имеет несколько представлений, некоторые представления ссылаются на другие контексты привязки, вот почему) - person M Yil; 09.03.2020
comment
если вы следуете MVVM, ваша страница содержимого должна иметь один BindingContext для всей страницы. Затем, если вам нужны элементы управления внутри страницы для привязки к другим ViewModels, вы можете сделать эти другие свойства viewmodels на vm ContentPage; родительская виртуальная машина, если хотите. - person Jonathan Cook; 09.03.2020
comment
У меня следующая проблема: приложение основано на страницах с вкладками. На одной из страниц с вкладками есть кнопка. Когда я нажимаю на нее, открываются новые страницы. На этой странице я могу заполнить запись. Когда я нажимаю "Отправить", страница откроется, и я вернусь на предыдущую страницу, страницу с вкладками. На этой странице с вкладками я хочу показать текст, написанный в записи. - person M Yil; 09.03.2020
comment
Вот почему я хотел связать страницу с моделью просмотра, а другую страницу, я хотел только привязать представление к модели просмотра, поэтому, когда происходит изменение, пользовательский интерфейс обновляется. И да, я следую шаблону mvvm. - person M Yil; 09.03.2020
comment
Вы можете достичь своей цели с помощью центра обмена сообщениями форм xamarin docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/ - person Marcel Callo; 09.03.2020
comment
Да, центр обмена сообщениями должен работать. Я не уверен, что понимаю ваши требования, но я отредактирую свой исходный пост, чтобы показать вам, как я бы это сделал. - person Jonathan Cook; 09.03.2020