Search code examples
xamlxamarinxamarin.formsdata-binding

Databind properties of a class in ContentView


I'm trying to achieve what I think is probably quite simple but as I'm new to Xamarin & Databinding I think I'm getting in a spin. I have a very simple ContentPage that just has a Databinding to my viewModel for this page and my ContentView, TotalsTemplate.

<ContentPage.BindingContext>
    <vm:DealsTodayViewModel />
</ContentPage.BindingContext>
<ContentPage.Content>
    <StackLayout>
        <template:TotalsTemplate></template:TotalsTemplate>
    </StackLayout>
</ContentPage.Content>

My viewmodel has a public property of my class, Totals, which has basic int,string,decimal props.

    public class DealsTodayViewModel
    {
        Public string ViewModelPeriod;
        public PeriodTotals Totals;
        public DealsTodayViewModel()
        {
            ViewModelPeriod = "TODAY";
            Totals = new PeriodTotals
            {
                Period = "DAILY",
                ClientServices_Deals_Chicago = 1,
                ClientServices_Deals_Manchester_Na = 1,
                ClientServices_Deals_Manchester_Uk = 1,
                ClientServices_Ramp_Chicago = 1.2m,
                ClientServices_Ramp_Manchester_Na = 1.3m,
                ClientServices_Ramp_Manchester_Uk = 1.4m
        };
    }
}

Now in my TotalsTemplte ContentView I have a Grid with following inside.

    <Label Text="{***Binding ViewModelPeriod***}" FontAttributes="Bold"/>
    <Frame OutlineColor="Black" Grid.Row="0" Grid.Column="1">
        <Label Text="{Binding ***Totals.Period***}" FontAttributes="Bold"/>
    </Frame>

My String property on the DealsTodayViewModel is visible in my ContentView but not the Perod property from inside my Totals property, am I binding incorrectly to this?


Solution

  • From the document, data-binding should binding between properties instead of field:

    Data binding is the technique of linking properties of two objects so that changes in one property are automatically reflected in the other property. Data binding is an integral part of the Model-View-ViewModel (MVVM) application architecture.

    So the solution is change the fields in your vm to properties:

    public class DealsTodayViewModel
    {
        public string ViewModelPeriod { get; set; }
        public PeriodTotals Totals { get; set; }
        public DealsTodayViewModel()
        {
            ...
        }
    }
    

    Refer: field and property