M Yil
M Yil

Reputation: 957

Xamarin forms - Pass argument to the bindingcontext viewmodel specified in a xaml file

I have a xaml file with with an entry. I am binding the specific entry to a specific viewmodel. But the viewmodel expects a Navigator. How can I pass the navigator from the xaml file to the viewmodel?

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

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

The viewmodel expects a navigation object. I use it to pop the page to go back to the previous page after running some code logic.

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

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

Upvotes: 1

Views: 1263

Answers (2)

user10627299
user10627299

Reputation: 9234

You do not need to use INavigation navigation in your SignaturePopupViewModel in your constructor to achieve the Navigation.

Just use a simple way is

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

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

like following code.

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

Upvotes: 3

Jonathan Cook
Jonathan Cook

Reputation: 63

Could you create an instance of the SignaturePopupVM in the ViewModel of that page and then bind the Text to that property instead?

VM:

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

Xaml:

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

Edit:

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 for tabpage:

<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>

Lets say TheViewForTabOne has the button on it that takes you to the new page. The VM for that view "TheVMForTabOne" would have something like this:

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

Upvotes: 1

Related Questions