繁体   English   中英

如何将数组索引绑定到DataGrid行索引?

[英]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(可以将属性绑定到该项目)。

其他要点:

  1. Item_Name属性违反了MVVM的预期抽象。 您的ViewModel不能了解有关视图的任何信息,以正确观察此模式。 否则,这是MVP。
  2. 从您的DataGrid中删除DataContext="{Binding invoice_items}" 没必要
  3. 不要设置dataGrid1.ItemsSource = MainViewModel.items; 在您的代码后面。 控件可以在绑定中处理此问题。 在MVVM中,最好不要在代码隐藏区中引用控件。 而是在构造函数中执行以下操作:

     this.DataContext = MainViewModel; 

在决定继续进行设计之前,建议您进一步研究MVVM模式,以了解它的目的和目的,这样您就不会遇到这些问题。 我向所有开始使用MVVM的人推荐Jason Dolinger(Lab49)编写的MVVM教程 尽管它来自几年前,但它确实以易于理解的方式完善了基础知识,我认为它确实可以为您提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM