更新WPF数据表格中的单元格

3
我有一个发票程序,用于跟踪客户可能想要购买的商品。每次按下“添加项目”按钮时,数量单元格会增加。我遇到的问题是值在后台得到了升级,但单元格本身没有改变。 如果您单击单元格,则该值将更新。但我希望它在我点击“添加项目”按钮时立即更新。我应该怎么做才能在点击此按钮时更新单元格信息呢? 这是我与按钮推送配合使用的代码。
public partial class MainWindow : Window
}
private void btnAddItem_Click(object sender, RoutedEventArgs e)
    {
        addDataGridRow(invoiceItemID, cbxItems.SelectedItem.ToString(), Convert.ToDouble(txtPrice.Text));
    }

    private void addDataGridRow(int id, string itemName, double itemPrice)
    {
        //lstDataItem.Add(new DataItem { sQTY = count.ToString(), sNAME = itemName, sPRICE = itemPrice, sRemove = "Delete Item" });
       // Rows = new ObservableCollection<DataItem> { new DataItem () };
        for (int i = 0; i < Rows.Count; i++)
        {
            if (Rows[i].sNAME == itemName)
            {
                Rows[i].sQTY = Rows[i].sQTY + 1;
                id = Rows[i].id;
                bSameItem = true;
            }
        }
        if (id == 0)
        {
            Rows.Add(new DataItem());
        }
        else if (!bSameItem)
        {
            Rows.Add(new DataItem());
        }


        if (!bSameItem)
        {
            Rows[id].id = id;
            Rows[id].sQTY = 1;
            Rows[id].sNAME = itemName;
            Rows[id].sPRICE = itemPrice;
            invoiceItemID++;
            dgInvoice.ItemsSource = Rows;

        }
        bSameItem = false;
    }
}

public class DataItem
{
    public int id { get; set; }
    public int sQTY { get; set; }
    public string sNAME { get; set; }
    public double sPRICE { get; set; }
}

我不知道你是否需要我的XAML,但为了确保,我在此附上。
        <DataGrid x:Name="dgInvoice" HorizontalAlignment="Left" Margin="10,92,0,0" VerticalAlignment="Top" Height="608" Width="488" AutoGenerateColumns="False" ItemsSource="{Binding}" RowHeight="25">
            <DataGrid.Columns>
                <DataGridTextColumn Header="QTY" Binding="{Binding Path=sQTY}" Width="100"/>
                <DataGridTextColumn Header="NAME" Binding="{Binding Path=sNAME}" Width="200"/>
                <DataGridTextColumn Header="PRICE" Binding="{Binding Path=sPRICE}" Width="80"/>
                <DataGridTemplateColumn Width="100">
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <Button Height="20">Delete Item</Button>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

我发现关于 WPF 的响应不是很多,希望能得到帮助。非常感谢。
2个回答

6
您需要在类上实现接口,以便任何属性的更改都能反映在UI上。请参考此处的链接。
public class DataItem : INotifyPropertyChanged
{
   public event PropertyChangedEventHandler PropertyChanged;

   private int id;
   public int Id
   {
      get { return id; }
      set
      {
         if(id != value)
         {
            id= value;
            OnPropertyChanged("Id");
         }
      }
   }

  // Create the OnPropertyChanged method to raise the event 
  protected void OnPropertyChanged(string name)
  {
     PropertyChangedEventHandler handler = PropertyChanged;
     if (handler != null)
     {
        handler(this, new PropertyChangedEventArgs(name));
     }
  }
}

让其他属性遵循与上面的Id相同的语法,您将看到属性值的任何更新都将反映在GUI上。


在我的情况下它不起作用。我正在更改数据表格中所选项目的值。尽管属性已更改,但当我双击行时才会立即反映出来。当我使用Items.Refresh()时它就可以工作了。有什么建议为什么会发生这种情况吗? - Rajon Tanducar

1

我刚才只需要执行 dgInvoices.Items.Refresh();


1
这不是在WPF中的正确做法。 - Rohit Vats
至少对于我的目的,它是有效的,但您非常欢迎告诉我如何实际操作。 - Doctor06
我已经添加了一个答案。 - Rohit Vats
2
这可能适用于您的情况。但是,很快当项目数量增加到1000个以上时,您将会发现代码性能存在问题。您所做的是对于任何单个项目更改,都要刷新集合中的所有项目。迟早会完全崩溃。 - Rohit Vats

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接