[英]How to bind array index to DataGrid row index?
我有InvoiceItem
类
public class InvoiceItem
{
private string item_name;
private string mesure;
private float quantity;
private float price_exc_VAC;
private float VAC;
private float price_inc_Vac;
private float total;
//Properties
}
还有另一个包含InvoiceItems
数组的类Invoice
public class Invoice
{
private InvoiceItem [] items = new InvoiceItem[100];
private string supplier;
private string supplierBank;
private int supplierAccount;
private string buyer;
private string buyerBank;
private int buyerAccount;
private string shipping_adress;
//Properties
}
我正在使用MVVM模式(不知道是否正确),并且有ItemViewModel
public class ItemViewModel : ViewModelBase
{
private Invoice invoice = new InvoiceItem();
public ItemViewModel(string tabName)
{
TabName = tabName;
}
public string TabName
{
get;
private set;
}
//example of one of the properties inside
public string Supplier
{
get
{
return invoice.supplier;
}
set
{
if (invoice.supplier != value)
{
invoice.supplier = value;
OnPropertyChanged("Supplier");
}
}
}
}
的ObservableCollection的
public class MainViewModel : ViewModelBase
{
public static ObservableCollection<ItemViewModel> items = new ObservableCollection<ItemViewModel>();
public static ObservableCollection<InvoiceItem> invoice_items = new ObservableCollection<InvoiceItem>();
public ObservableCollection<ItemViewModel> Items
{
get
{
return items;
}
set
{
items = value;
OnPropertyChanged("Items");
}
}
public ObservableCollection<InvoiceItem> Invoice_Items
{
get
{
return invoice_items;
}
set
{
invoice_items = value;
OnPropertyChanged("Invoice_Items");
}
}
在我的TabItemView.xaml
我已将DataGrid
绑定到InvoiceItem
集合
<DataGrid AutoGenerateColumns="False" Grid.ColumnSpan="5" Grid.Row="3"
Height="104" HorizontalAlignment="Stretch" Margin="55,115,55,0" Name="dataGrid1"
VerticalAlignment="Top" Width="Auto" CanUserResizeRows="True" ItemsSource="{Binding invoice_items}"
DataContext="{Binding invoice_items}" IsReadOnly="False" SelectionUnit="Cell" CanUserAddRows="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Item Name" Binding="{Binding Item_Name}"/>
<DataGridTextColumn Header="Mesure" Binding="{Binding Mesure}"/>
<DataGridTextColumn Header="Quantity" Binding="{Binding Quantity}"/>
<DataGridTextColumn Header="Price exc VAT" Binding="{Binding Price_exc_VAT}"/>
<DataGridTextColumn Header="VAT" Binding="{Binding VAT}"/>
<DataGridTextColumn Header="Price Inc VAT" Binding="{Binding Price_inc_VAT}"/>
<DataGridTextColumn Header="Total" Binding="{Binding Total}"/>
</DataGrid.Columns>
</DataGrid>
TabItemView.xaml.cs
外观
public partial class TabItemView : UserControl
{
public TabItemView()
{
InitializeComponent();
dataGrid1.ItemsSource = MainViewModel.items;
}
}
我需要将数组索引绑定到datagrid行索引,因为我需要为我的items
数组中的每个属性设置属性。 我猜应该看起来像
public string Item_Name
{
get
{
return invoice.items[RowIndex].Item_Name;
}
set
{
if (invoice.items[RowIndex].Item_Name != value)
{
invoice.items[RowIndex].Item_Name = value;
OnPropertyChanged("Item_Name");
}
}
}
另外,我不知道在什么时候需要向我的项数组添加新项。 我认为应该在用户更改行时添加。 但是我该如何实现呢?
我也试图查看我与DataGrid的数据绑定是否正确,并且删除了数组,并留下了这样的代码: InvoiceItem items = new InvoiceItem();
结果,我的DataGrid
仅显示了一行,而我无法添加另一行。 为什么?
这里有几个问题,但是我建议的第一件事是摆脱必须直接与DataGrid进行交互的想法。 您应该将其视为表达您的收藏的控件; 无需您直接进行持续管理。
所以,我想问:为什么您真的需要知道特定行的确切索引? 选择一个项目后,您只需查看DataGrid中的SelectedItem(可以将属性绑定到该项目)。
其他要点:
DataContext="{Binding invoice_items}"
。 没必要 不要设置dataGrid1.ItemsSource = MainViewModel.items;
在您的代码后面。 控件可以在绑定中处理此问题。 在MVVM中,最好不要在代码隐藏区中引用控件。 而是在构造函数中执行以下操作:
this.DataContext = MainViewModel;
在决定继续进行设计之前,建议您进一步研究MVVM模式,以了解它的目的和目的,这样您就不会遇到这些问题。 我向所有开始使用MVVM的人推荐Jason Dolinger(Lab49)编写的MVVM教程 。 尽管它来自几年前,但它确实以易于理解的方式完善了基础知识,我认为它确实可以为您提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.