我上课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
}
另一个包含Invoice
InvoiceItems
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");
}
}
}
另外,我不知道在什么时候我需要在我的items数组中添加一个新Item。我认为应该在用户更改行时添加。但是我该如何实现呢?
另外,我试着看看我对DataGrid的数据绑定是否正确,我删除了数组并留下了像InvoiceItem items = new InvoiceItem();
这样的代码。结果我的DataGrid
只显示了一行而我又无法添加另一行。为什么呢?
答案 0 :(得分:1)
你有几个问题在这里,但我建议的第一件事是超越必须直接与DataGrid交互的想法。您应该将其视为表达您的收藏的控件;不是你需要经常直接管理的东西。
所以,我会问:为什么你真的需要知道特定行的确切索引?当您选择了一个项目时,您可以只查看DataGrid中的SelectedItem(您可以将属性绑定到)。
其他要点:
DataContext="{Binding invoice_items}"
。这是不必要的。请勿在代码中设置dataGrid1.ItemsSource = MainViewModel.items;
。控件可以在它的绑定中处理它。在MVVM中,最好不要在可能的情况下引用代码隐藏中的控件。而是在你的构造函数中执行:
this.DataContext = MainViewModel;
在您决定推进设计之前,我建议您更多地研究MVVM模式,以了解它的重点和目的,以免您遇到这些问题。我向任何刚开始使用MVVM的人推荐this MVVM tutorial by Jason Dolinger (Lab49)。虽然它来自几年前,它确实以一种易于理解的方式指导基础,我认为它可以真正帮助你。