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

标签 c# wpf xaml mvvm datagrid

我有课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/

    相关文章:

    c# - MVVM WPF - 登录逻辑

    多个控件刷新时 WPF 闪烁问题

    .net - 在 xaml 中为组合框设置选定值时出现问题

    c# - 用 C# 编写的 COM 对象 - 获取类,但不获取方法

    c# - ASP.NET MVC 5 - JSON - (动态?)模型绑定(bind) - REST 服务 - Webhooks - Chargebee

    WPF 投影

    c# - 如何将 XAML 元素设置为默认为当前年份?

    c# - 函数代码块不能访问 Razor 代码块中的变量吗?

    C# hash 和 sql server hashbytes 函数,相同的实现?

    c# - 使用 WPF 工具包的 WPF 堆叠条形图