C# xaml UI未在xamarin表单中更新

C# xaml UI未在xamarin表单中更新,c#,xaml,xamarin,xamarin.forms,C#,Xaml,Xamarin,Xamarin.forms,我正在用我的UI绑定我的模型,在我的模型中,我做了一些计算,但其他属性与UI绑定,但我做计算的一些属性不与我的UI绑定,而是在我的OnPropertyChange事件中显示计算。请帮助我解决代码中的问题,提前感谢 -----我的模型---- --我是根据比率和数量属性计算总量和余额--- ----OnPropertyChange事件--- ---我的xaml代码--- 在上面的图像中,计算正在显示,但未在我的UI中绑定。您需要对SalentryModel中的每个绑定属性进行属性更改。请参考

我正在用我的UI绑定我的模型,在我的模型中,我做了一些计算,但其他属性与UI绑定,但我做计算的一些属性不与我的UI绑定,而是在我的OnPropertyChange事件中显示计算。请帮助我解决代码中的问题,提前感谢

-----我的模型----

--我是根据比率和数量属性计算总量和余额---

----OnPropertyChange事件---

---我的xaml代码---



在上面的图像中,计算正在显示,但未在我的UI中绑定。

您需要对SalentryModel中的每个绑定属性进行属性更改。请参考以下代码

 public partial class CalculationQ : ContentPage
    {
        public CalculationQ()
        {
            InitializeComponent();
            this.BindingContext = this;
            GetSaleEntry();
        }

        private SaleEntryModel bindSaleEntryModel = new SaleEntryModel();
        public SaleEntryModel BindSaleEntryModel
        {
            get { return bindSaleEntryModel; }
            set
            {
                bindSaleEntryModel = value;
                OnPropertyChanged(nameof(BindSaleEntryModel));
            }
        }

        private void GetSaleEntry()
        {
            BindSaleEntryModel.SaleID = 1;
            BindSaleEntryModel.CustomerName = "Murugan";
            BindSaleEntryModel.ProductID = 1;
            BindSaleEntryModel.ProductName = "Toy";
            BindSaleEntryModel.Quantity = 5;
            BindSaleEntryModel.Rate = 150;
            BindSaleEntryModel.Discount = 5;
            BindSaleEntryModel.PaidAmount = 250;
        }

    }

    public class SaleEntryModel : INotifyPropertyChanged
    {

        public int SaleID { get; set; }

        private string _customerName;
        public string CustomerName
        {
            get { return _customerName; }
            set
            {
                _customerName = value;
                OnPropertyChange(nameof(CustomerName));
            }
        }

        public int ProductID { get; set; }

        private string _productName;
        public string ProductName
        {
            get { return _productName; }
            set
            {
                _productName = value;
                OnPropertyChange(nameof(ProductName));
            }
        }

        private decimal _quantity;
        public decimal Quantity
        {
            get { return _quantity; }
            set
            {
                _quantity = value;
                OnPropertyChange(nameof(Quantity));
                OnPropertyChange(nameof(Total));
                OnPropertyChange(nameof(Balance));
            }
        }

        private decimal _rate;


        public decimal Rate
        {
            get { return _rate; }
            set
            {
                _rate = value;
                OnPropertyChange(nameof(Rate));
                OnPropertyChange(nameof(Total));
                OnPropertyChange(nameof(Balance));
            }
        }

        public decimal Total => Rate * Quantity;

        public decimal Balance => (Total - (Discount + PaidAmount));

        private int _discount;
        public int Discount
        {
            get => _discount;
            set
            {
                _discount = value;
                OnPropertyChange(nameof(Discount));
                OnPropertyChange(nameof(Balance));
            }
        }

        private int _paidAmount;
        public int PaidAmount
        {
            get => _paidAmount;
            set
            {
                _paidAmount = value;
                OnPropertyChange(nameof(PaidAmount));
                OnPropertyChange(nameof(Balance));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChange(string propName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
            }
        }

    }

我的建议是为viewmodel绑定保留单独的模型,而不是使用实体模型。

SalentryModel还需要在SalentryModel中实现INotifyPropertyChangedapply INotifyPropertyChanged?是的,如果该类包含要动态更新的属性,然后该类应该实现INPC,并且这些属性应该引发PropertyChanged事件。我也使用了INPC,比如私有的SaleEntryModel bindsalentryModel=new SaleEntryModel();public SaleEntryModel BindSaleEntryModel{get{return BindSaleEntryModel;}set{BindSaleEntryModel=value;OnPropertyChanged(nameof(BindSaleEntryModel));}}请不要在注释中发布代码,这是很难阅读。谢谢你的答复,我已经实现了上述代码,它正在工作。
    private SaleEntryModel bindSaleEntryModel = new SaleEntryModel();

    public SaleEntryModel BindSaleEntryModel
    {
        get { return bindSaleEntryModel; }
        set
        {
            bindSaleEntryModel = value;
            OnPropertyChanged(nameof(BindSaleEntryModel));
        }
    }
 <StackLayout Orientation="Vertical" HorizontalOptions="FillAndExpand" 
  VerticalOptions="FillAndExpand" Padding="10">

       
            <Label  Text="Rate" Margin="2,-10" FontAttributes="Bold" />


            <Entry x:Name="Rate" Margin="2,-5,2,5" Text="{Binding BindSaleEntryModel.Rate,Mode=TwoWay}"
                   HorizontalOptions="FillAndExpand" Keyboard="Numeric" ReturnType="Next" />

            <Label x:Name="RateError" Margin="2,-10,2,5" TextColor="Red" IsVisible="false" FontAttributes="Italic" />

            <Label Text="Quantity" Margin="2,-10" FontAttributes="Bold" />

            <Entry x:Name="Quantity"  Margin="2,-5,2,5" Text="{Binding BindSaleEntryModel.Quantity,Mode=TwoWay}"
                   HorizontalOptions="FillAndExpand" Keyboard="Numeric" ReturnType="Next" />
            <Label x:Name="QuantityError" Margin="2,-10,2,5" TextColor="Red" IsVisible="false" FontAttributes="Italic" />

            <Label Text="Total" Margin="2,-10" FontAttributes="Bold" />

            <Entry x:Name="Total" Margin="2,-5,2,5" IsEnabled="False"
                   Text="{Binding BindSaleEntryModel.Totals,Mode=TwoWay}"
                   HorizontalOptions="FillAndExpand" ReturnType="Next"/>

            <Label Text="Discount (Rs)" Margin="2,-10" FontAttributes="Bold" />

            <Entry x:Name="Discount" Margin="2,-5,2,5" Text="{Binding BindSaleEntryModel.Discount,Mode=TwoWay}"
                   HorizontalOptions="FillAndExpand" 
                   Keyboard="Numeric" ReturnType="Next"/>
            <Label x:Name="DiscountError" Margin="2,-10,2,5" TextColor="Red" IsVisible="false" FontAttributes="Italic" />

            <Label Text="Paid Amount" Margin="2,-10" FontAttributes="Bold" />

            <Entry x:Name="PaidAmount" Margin="2,-5,2,5" Text="{Binding BindSaleEntryModel.PaidAmount,Mode=TwoWay}"
                   HorizontalOptions="FillAndExpand" Keyboard="Numeric" ReturnType="Next"/>
            <Label x:Name="PaidAmountError" Margin="2,-10,2,5" TextColor="Red" IsVisible="false" FontAttributes="Italic" />

            <Label Text="Balance" Margin="2,-10" FontAttributes="Bold" />

            <Entry x:Name="Balance"  Margin="2,-5,2,5" IsEnabled="False"
                   Text="{Binding BindSaleEntryModel.Balance,Mode=TwoWay}"
                   HorizontalOptions="FillAndExpand" />

            
            <Grid HorizontalOptions="FillAndExpand">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*" />
                    <ColumnDefinition Width="1*" />
                </Grid.ColumnDefinitions>

                <Button Text="Save" x:Name="btnSave" HorizontalOptions="FillAndExpand" 
                        CornerRadius="10" BorderWidth="2" BackgroundColor="#ff6633" TextColor="#fff" Margin="2" 
                        Grid.Column="0" Grid.Row="0" Command="{Binding SaveCommand}" />

                <Button Text="CLEAR" x:Name="btnClear" HorizontalOptions="FillAndExpand"
                        CornerRadius="10" BorderWidth="2" BackgroundColor="#bfbfbf" 
                        TextColor="#fff" Margin="2" Grid.Column="1" Grid.Row="0" Command="{Binding ClearCommand}" />
            </Grid>


        </StackLayout>
 public partial class CalculationQ : ContentPage
    {
        public CalculationQ()
        {
            InitializeComponent();
            this.BindingContext = this;
            GetSaleEntry();
        }

        private SaleEntryModel bindSaleEntryModel = new SaleEntryModel();
        public SaleEntryModel BindSaleEntryModel
        {
            get { return bindSaleEntryModel; }
            set
            {
                bindSaleEntryModel = value;
                OnPropertyChanged(nameof(BindSaleEntryModel));
            }
        }

        private void GetSaleEntry()
        {
            BindSaleEntryModel.SaleID = 1;
            BindSaleEntryModel.CustomerName = "Murugan";
            BindSaleEntryModel.ProductID = 1;
            BindSaleEntryModel.ProductName = "Toy";
            BindSaleEntryModel.Quantity = 5;
            BindSaleEntryModel.Rate = 150;
            BindSaleEntryModel.Discount = 5;
            BindSaleEntryModel.PaidAmount = 250;
        }

    }

    public class SaleEntryModel : INotifyPropertyChanged
    {

        public int SaleID { get; set; }

        private string _customerName;
        public string CustomerName
        {
            get { return _customerName; }
            set
            {
                _customerName = value;
                OnPropertyChange(nameof(CustomerName));
            }
        }

        public int ProductID { get; set; }

        private string _productName;
        public string ProductName
        {
            get { return _productName; }
            set
            {
                _productName = value;
                OnPropertyChange(nameof(ProductName));
            }
        }

        private decimal _quantity;
        public decimal Quantity
        {
            get { return _quantity; }
            set
            {
                _quantity = value;
                OnPropertyChange(nameof(Quantity));
                OnPropertyChange(nameof(Total));
                OnPropertyChange(nameof(Balance));
            }
        }

        private decimal _rate;


        public decimal Rate
        {
            get { return _rate; }
            set
            {
                _rate = value;
                OnPropertyChange(nameof(Rate));
                OnPropertyChange(nameof(Total));
                OnPropertyChange(nameof(Balance));
            }
        }

        public decimal Total => Rate * Quantity;

        public decimal Balance => (Total - (Discount + PaidAmount));

        private int _discount;
        public int Discount
        {
            get => _discount;
            set
            {
                _discount = value;
                OnPropertyChange(nameof(Discount));
                OnPropertyChange(nameof(Balance));
            }
        }

        private int _paidAmount;
        public int PaidAmount
        {
            get => _paidAmount;
            set
            {
                _paidAmount = value;
                OnPropertyChange(nameof(PaidAmount));
                OnPropertyChange(nameof(Balance));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChange(string propName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
            }
        }

    }