有人可以告诉我Xamarin中的Binding哪里出了问题

时间:2019-11-17 21:07:39

标签: c# xaml xamarin

下面,我附上了我的xaml和cs文件的摘要。我正在尝试将输入框绑定到正确的属性,并将标签绑定到total属性。我显然在某个地方出错了,但我无法将手指放在哪里。使用WPF时,我以相同的方式布置绑定。我已经尝试过搜索该视频和几段视频,但似乎都没有解决我的问题。

XAML

 <Label Text="{Binding Total}"
               TextColor="Black"
               FontSize="50"
               Grid.Column="1"
               Grid.ColumnSpan="3"
               Grid.Row="4"
               Grid.RowSpan="1"
               VerticalOptions="Center"
               HorizontalOptions="Center"/>

        <Label Text="APR Amount"
               TextColor="Black"
               FontSize="16"
               Grid.Column="1"
               Grid.ColumnSpan="3"
               Grid.Row="5"
               Grid.RowSpan="1"
               VerticalOptions="Center"
               HorizontalOptions="Center"/>

        <Label Text="£APR"
               TextColor="Black"
               FontSize="30"
               Grid.Column="1"
               Grid.ColumnSpan="3"
               Grid.Row="6"
               Grid.RowSpan="1"
               VerticalOptions="Center"
               HorizontalOptions="Center"/>

         <BoxView Color="CornflowerBlue"
                CornerRadius="0"
                Grid.Column="0"
                Grid.ColumnSpan="5"
                Grid.Row="7"
                Grid.RowSpan="1"   
                WidthRequest="700"
                HeightRequest="5"
                VerticalOptions="Center"
                HorizontalOptions="Center" />

        <Label Text="Loan Amount"
               TextColor="Black"
               FontSize="20"
               Grid.Column="0"
               Grid.ColumnSpan="3"
               Grid.Row="9"
               Grid.RowSpan="2"
               VerticalOptions="Center"
               HorizontalOptions="Center"
               Margin="0,0,0,0" />

        <Entry Grid.Row="9"
               Grid.Column="2"
               Grid.ColumnSpan="3"
               Grid.RowSpan="2"
               WidthRequest="120"
               VerticalOptions="Center"
               HorizontalOptions="End"
               Text="{Binding loanLength}"
               Margin="0,0,45,0" />

         <Label Text="Interest Rate"
               TextColor="Black"
               FontSize="20"
               Grid.Column="0"
               Grid.ColumnSpan="3"
               Grid.Row="11"
               Grid.RowSpan="2"
               VerticalOptions="Center"
               HorizontalOptions="Center"
               Margin="0,0,0,0" />

        <Entry Grid.Row="11"
               Grid.RowSpan="2"
               Grid.Column="2"
               Grid.ColumnSpan="3"
               WidthRequest="120"
               VerticalOptions="Center"
               HorizontalOptions="End"
               Text="{Binding intRate}"
               Margin="0,0,45,0" />

        <Label Text="Loan Length (Years)"
               TextColor="Black"
               FontSize="20"
               Grid.Column="0"
               Grid.ColumnSpan="3"
               Grid.Row="13"
               Grid.RowSpan="2"
               VerticalOptions="Center"
               HorizontalOptions="Center"
               Margin="0,0,0,0" />

        <Entry Grid.Row="13"
               Grid.RowSpan="2"
               Grid.Column="2"
               Grid.ColumnSpan="3"
               WidthRequest="120"
               VerticalOptions="Center"
               HorizontalOptions="End"
               Text="{Binding loanLength}"
               Margin="0,0,45,0"/>

C#

  private int loanAmount { get; set; }
        public int Loan
        {
            get => loanAmount;
            set
            {

                loanAmount = value;
                OnPropertyChanged("Loan");
                CalculateAPR();
            }

        }


        private int intRate { get; set; }
        public int Interest
        {
            get => intRate;
            set
            {

                intRate = value;
                OnPropertyChanged("Interest");
                CalculateAPR();
            }

        }

        private int loanLength { get; set; }
        public int Length
        {
            get => loanLength;
            set
            {

                loanLength = value;
                OnPropertyChanged("Length");
                CalculateAPR();
            }

        }


        private string total { get; set; }
        public string Total
        {
            get => total;
            set
            {

                total = value;
                OnPropertyChanged("Total");
            }
        }



        public void CalculateAPR()
        {
            if (Interest != 0)
            {
                Total = "£" + (Loan * Length) / Interest;
            }
            else
            {
                Total = "£ -";
            }
        }

2 个答案:

答案 0 :(得分:1)

您需要绑定到“ Length”或“ Interest”之类的公共财产 并调用PropertyChanged(nameof(loanLength));例如(内部有私人空间)

如果需要请检查  https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/data-binding-basics

答案 1 :(得分:0)

我创建了一个演示来模拟您的代码,并且演示正常。 您的代码中存在几个问题:

1。我们应该绑定一个公共属性,例如,您可以这样绑定:

      <Entry 
           Text="{Binding Loan}"
           Margin="0,0,45,0" />

代替

      <Entry 
           Text="{Binding loanLength}"
           Margin="0,0,45,0" />

其他字段也是如此。

<Entry Text="{Binding intRate }"/>替换为<Entry Text="{Binding Interest}"/>

<Entry Text="{Binding loanLength }"/>替换为<Entry Text="{Binding Length}"/>

2。尝试以下bindingContext代码:

   <Grid >
    <Grid.BindingContext>
        <local:ViewModel></local:ViewModel>
    </Grid.BindingContext>
    <Grid.RowDefinitions>

    </Grid.RowDefinitions>

    <!--other code-->

 </Grid>