【发布时间】:2017-04-12 13:56:51
【问题描述】:
我无法理解如何将 UI 上的总销售额文本框绑定到数据网格中的总价格总和。我已经阅读了几篇文章,尝试实现一个求和过程并绑定它,尝试使用集合更改通知,但我无法让总销售额起作用。我有一个具有 Quantity 和 UnitPrice 属性的项目类,其中计算的 TotalPrice 会在数量或单价变化时自动更新。项目列表包含在 SalesOrder 类中。 ui 是我用来创建订单的主窗口。 我的代码在:https://github.com/battondl/SalesOrder/tree/master/simpleShoppingListProgram 任何有关如何获取 UI 文本框总价以自动更新的指导将不胜感激。
数据网格中的每个行项目都有一个基于数量 * 单价的总价。
这是我尝试更新的总销售价格,它是所有订单项总价格的总和。
class Item : INotifyPropertyChanged
{
private string partNumber;
private int quantity;
private decimal unitPrice;
private DateTime orderDate;
public string PartNumber
{
get { return partNumber; }
set
{
partNumber = value;
OnPropertyChanged();
}
}
public int Quantity
{
get { return quantity; }
set
{
quantity = value;
OnPropertyChanged("Quantity");
OnPropertyChanged("TotalPrice");
}
}
public decimal UnitPrice
{
get { return unitPrice; }
set
{
unitPrice = value;
OnPropertyChanged("UnitPrice");
OnPropertyChanged("TotalPrice");
}
}
public DateTime OrderDate
{
get { return orderDate; }
set
{
orderDate = value;
OnPropertyChanged();
}
}
public decimal TotalPrice => Quantity * UnitPrice;
public Item()
{
PartNumber = "";
Quantity = 0;
UnitPrice = 0.00m;
OrderDate = DateTime.Now;
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string caller = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(caller));
}
}
}
class SalesOrder
{
private string orderNumber;
public string OrderNumber
{
get { return orderNumber; }
set
{
orderNumber = value;
}
}
private ObservableCollection<Item> items;
public ObservableCollection<Item> Items
{
get { return items; }
}
public SalesOrder()
{
orderNumber = "";
items = new ObservableCollection<Item>();
}
public decimal CalculateTotalPrice()
{
decimal total = 0.00m;
foreach (Item item in items)
{
total += item.TotalPrice;
}
return total;
}
}
public partial class MainWindow : Window
{
private SalesOrder salesOrder;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
salesOrder = new SalesOrder();
dgSaleItems.ItemsSource = salesOrder.Items;
tbx_totalSale.Text = salesOrder.CalculateTotalPrice().ToString();
}
}
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="6*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Vertical"
Grid.Row="0">
<StackPanel Orientation="Horizontal">
<Label Content="OrderNumber: " />
<TextBox Name="tbx_orderNumber"
Width="100"/>
</StackPanel>
</StackPanel>
<StackPanel Orientation="Vertical"
Grid.Row="1">
<DataGrid Name="dgSaleItems"
Grid.Row="1"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn x:Name="partNumber"
Header="Part Number"
Binding="{Binding Path=PartNumber}" />
<DataGridTextColumn x:Name="quantity"
Header="Quantity"
Binding="{Binding Path=Quantity}" />
<DataGridTextColumn x:Name="unitPrice"
Header="Unit Price"
Binding="{Binding Path=UnitPrice}" />
<DataGridTextColumn x:Name="totalPrice"
Header="Total Price"
Binding="{Binding Path=TotalPrice}" />
<DataGridTemplateColumn x:Name="orderDate"
Header="Order Date">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=OrderDate}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding Path=OrderDate}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
<StackPanel Orientation="Vertical"
Grid.Row="7">
<StackPanel Orientation="Horizontal">
<Label Content="Total Sale: " />
<TextBox x:Name="tbx_totalSale"
Width="100"/>
</StackPanel>
</StackPanel>
</Grid>
【问题讨论】:
-
请将相关代码放入问题中。如果有的话,还要解释“总销售额”和
TotalPrice之间的区别。如果它们相同,那么您要解决的问题是什么?如果它们不同,为什么不以相同的方式进行呢? -
我在 txtbox 上根本看不到任何绑定...发布代码会有所帮助...
-
总价是按数量*单价计算的每个订单项。我还取出了不起作用的绑定,因为它不起作用。总销售额是所有订单项总价的总和。
标签: c# wpf data-binding datagrid sum