gpt4 book ai didi

c# - 如何将数组索引绑定(bind)到 DataGrid 行索引?

转载 作者:行者123 更新时间:2023-12-03 10:35:25 25 4
gpt4 key购买 nike

我有课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绑定(bind)到 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;

}

}

我需要将数组索引绑定(bind)到数据网格行索引,因为我需要为我的 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 的数据绑定(bind)是否正确,并删除了数组并留下这样的代码 InvoiceItem items = new InvoiceItem();结果我的 DataGrid仅显示一行,我无法添加另一行。为什么?

最佳答案

您在这里遇到了几个问题,但我建议的第一件事是克服必须直接与 DataGrid 交互的想法。您应该将其视为表达您的收藏的控件;不是您需要不断直接管理的东西。

所以,我会问:为什么你真的需要知道特定行的确切索引?当您选择了一个项目时,您只需查看 DataGrid 中的 SelectedItem(您可以将属性绑定(bind)到它)。

其他要点:

  • 元素名称 属性违反了 MVVM 的预期抽象。您的 ViewModel 无法了解有关 View 的任何信息,以便正确观察此模式。否则,这就是MVP。
  • 删除 DataContext="{Binding invoice_items}"从您的数据网格。这是不必要的。
  • 不要设置dataGrid1.ItemsSource = MainViewModel.items;在你的代码后面。控件可以在其绑定(bind)中处理此问题。在 MVVM 中,尽可能不要在代码隐藏中引用控件。而是在您的构造函数中执行以下操作:
    this.DataContext = MainViewModel;

  • 在你决定继续你的设计之前,我建议你更多地研究 MVVM 模式,以了解它的意义和目的,这样你就不会遇到这些问题。我推荐 this MVVM tutorial by Jason Dolinger (Lab49)对于任何刚开始使用 MVVM 的人。虽然它是几年前的,但它确实以一种易于理解的方式明确了基础知识,我认为它真的可以帮助你。

    关于c# - 如何将数组索引绑定(bind)到 DataGrid 行索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31770123/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com