Laire
Laire

Reputation: 1330

how can I manipulate the View (XAML) from my ViewModel? (Xamarin Forms)

how can I manipulate the View (XAML) from my ViewModel?

For example, I have a detail view for an object. The view have a grid. Depending of the object, the Grid should have different count of rows and cols. The number of cols and rows is set in the object details. Is it possible to do that from the ViewModel or I have to do that in the View .cs?

I open the detail view from a ListView (OnItemSelect):

await Navigation.PushAsync(new AlgoDetailPage(new AlgoDetailViewModel(algo)));

AlgoDetailPage - Here I want to add the cols and rows, depending of the object.

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="NotsanHessen.Views.AlgoDetailPage"
             Title="{Binding Algo.Title}">
    <StackLayout>
        <Grid>

        </Grid>
    </StackLayout>
</ContentPage>

The AlgoDetailPage.cs:

    public partial class AlgoDetailPage : ContentPage
    {
        AlgoDetailViewModel viewModel;

        public AlgoDetailPage(AlgoDetailViewModel viewModel)
        {
            InitializeComponent();
            BindingContext = this.viewModel = viewModel;
        }

        public AlgoDetailPage()
        {
            InitializeComponent();
            BindingContext = viewModel;
        }
    }

The ViewModel:

public class AlgoDetailViewModel : BaseViewModel
{
    public Algo Algo { get; set; }

    public AlgoDetailViewModel(Algo algo = null)
    {
        this.Algo = algo;

        // Rows: algo.Rows
        // Cols: algoCols
    }
}

Upvotes: 0

Views: 538

Answers (4)

Nidrax
Nidrax

Reputation: 370

And if you REALLY necessarily want to access the View from ViewModel, you can Bind View's Load Event to a Command and pass the View itself as a Command Parameter.

Upvotes: 0

Abdul Gani
Abdul Gani

Reputation: 689

If it is a complex grid, have two different content views. In your xaml, based on the condition show or hide the content views. In this way, you can keep the code manageable any time.

Upvotes: 0

Jason
Jason

Reputation: 89082

you don't manipulate the View from the VM. Instead, the View should use the VM's properties to determine it's layout. In this case, you would add the rows and cols in the View based on the data from the VM.

Upvotes: 1

Ivan I
Ivan I

Reputation: 9990

Technically, you don't have to do that from View itself. If you want to be exactly orthodox you can create the custom control that will handle the binding for you. Personally I wouldn't recommend this level of following some theory, but if you want it it is possible.

Other than that you may try to take a look at CollectionView that will appear in Xamarin 4.0 it may be close to what you have requested (you haven't specified exactly how column width is to be handled). Also there could be some 3rd party components that can handle this.

Upvotes: 0

Related Questions