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

时间:2015-08-02 08:46:29

标签: 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.xamlDataGrid绑定到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只显示了一行而我又无法添加另一行。为什么呢?

1 个答案:

答案 0 :(得分:1)

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

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

其他要点:

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

    this.DataContext = MainViewModel;
    
  4. 在您决定推进设计之前,我建议您更多地研究MVVM模式,以了解它的重点和目的,以免您遇到这些问题。我向任何刚开始使用MVVM的人推荐this MVVM tutorial by Jason Dolinger (Lab49)。虽然它来自几年前,它确实以一种易于理解的方式指导基础,我认为它可以真正帮助你。