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