代码之家  ›  专栏  ›  技术社区  ›  Raj

绑定集合更新时WPF DataGrid行没有更新?

  •  3
  • Raj  · 技术社区  · 14 年前

    我有一个产品类- 产品公司

    class Products : INotifyPropertyChanged
    {
        private int productId = 0;
        private int quantity = 0;
        private string description = string.Empty;
        private decimal price = 0.0m;
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        public Products()
        {
        }
    
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
        #region Properties
    
        public int ProductID
        {
            get { return this.productId; }
            set
            {
                if (value != productId)
                {
                    this.productId = value;
                    OnPropertyChanged("ProductID");
                }
            }
        }
    
        public int Quantity
        {
            get { return this.quantity; }
            set
            {
                if (value != this.quantity)
                {
                    this.quantity = value;
                    OnPropertyChanged("Quantity");
                    OnPropertyChanged("SubTotal");
                }
    
            }
        }
    
        public String Description
        {
            get { return this.description;}
            set
            {
                if (value != this.description)
                {
                    this.description = value;
                    OnPropertyChanged("Description");
                }
            }
        }
    
        public Decimal Price
        {
            get { return this.price; }
            set
            {
                if (value != this.price)
                {
                    this.price = value;
                    OnPropertyChanged("Price");
                }
            }
        }
    
        public Decimal SubTotal
        {
            get { return Quantity * Price; }
        }
    
        public static List<Products> ProductList
        {
            get { return new List<Products>(); }
        }     
    
        #endregion
    }
    

    然后我有 二级分类 若要实现添加,请编辑和删除列表中的项目。

    class BillClass
    {
        public List<Products> ProductsList = new List<Products>();
        Products products;
    
        public BillClass()
        {
            AddProducts(1, 2, 20.00m, "a");            
        }
    
        public void AddProducts(int _pid, int _quantity, decimal _price, string _desc)
        {
            products = new Products();
            products.ProductID = _pid;
            products.Quantity = _quantity;
            products.Price = _price;            
            products.Description = _desc;
    
            ProductsList.Add(products);
        }
    
        public bool RemoveProduct(int _id)
        {
            ProductsList.Remove(ProductsList.Find(e => e.ProductID.Equals(_id)));
            return true;
        }
    
        public void EditProducts(int _pid, int _quantity)
        {
            Products ob = ProductsList.Find(e => e.ProductID.Equals(_pid));
            ob.Quantity = _quantity;            
        }
    
        public List<Products> GetItems()
        {
            return ProductsList;
        }
    

    我已经将这个“产品列表”绑定到WPF数据报。此DataGrid显示集合中已存在的项(在BillClass构造函数中添加的数据),但不显示通过包含DataGrid的销售窗口添加的新项。

    DataGrid XAML代码

    <Custom:DataGrid ItemsSource="{Binding Path=ProductsList}" Margin="16,100,16,120" AutoGenerateColumns="False" x:Name="dataGrid" HorizontalGridLinesBrush="#FFD0D0D0" 
                VerticalGridLinesBrush="#FFD0D0D0" CanUserDeleteRows="True" CanUserResizeRows="False" Background="White" IsTabStop="False" Focusable="False" IsReadOnly="True" CanUserSortColumns="False" CanUserResizeColumns="False" CanUserReorderColumns="False" GridLinesVisibility="Horizontal" EnableRowVirtualization="False">
                <Custom:DataGrid.Columns>
                    <Custom:DataGridTextColumn Binding="{Binding Path=ProductID}" Header="Sl" Width="40" IsReadOnly="True" CanUserSort="False" CanUserResize="False" CanUserReorder="False" />
                    <Custom:DataGridTextColumn Binding="{Binding Path=ProductID}" Header="Product Code" Width="100" IsReadOnly="True" CanUserSort="False" CanUserResize="False" CanUserReorder="False" />
                    <Custom:DataGridTextColumn Binding="{Binding Path=Description}" Header="Description" Width="250" IsReadOnly="True" CanUserSort="False" CanUserResize="False" CanUserReorder="False" />
                    <Custom:DataGridTextColumn Binding="{Binding Path=Price}" Header="Unit Price (in Rs.)" Width="120" IsReadOnly="True" CanUserSort="False" CanUserResize="False" CanUserReorder="False" />
                    <Custom:DataGridTextColumn Binding="{Binding Path=Quantity}" Header="Quantity" Width="120" IsReadOnly="True" CanUserSort="False" CanUserResize="False" CanUserReorder="False" />
                    <Custom:DataGridTextColumn Binding="{Binding Path=SubTotal, Mode=OneWay}" Header="Total (in Rs.)" Width="120" IsReadOnly="True" CanUserSort="False" CanUserResize="False" CanUserReorder="False" />                                         
                </Custom:DataGrid.Columns>                      
            </Custom:DataGrid>
    

    一些代码会有帮助

    谢谢

    2 回复  |  直到 8 年前
        1
  •  5
  •   Abdullah BaMusa    14 年前

    您的产品类必须实现InotifyPropertyChanged接口,并且您应该在每次更改时更新可绑定属性以引发此事件。这就是绑定在WPF中的工作方式。 像这样的片段

    public class Produts : INotifyPropertyChanged
        {
    public Produts()
            {
    
            }
        int productID;
        public int ProductID
        {
            get { return productID; }
            set
            {
                if (productID != value)
                {
                    productID = value;
                    OnPropertyChange("ProductID");
                }
            }
        }
        int quantity;
        public int Quantity
        {
            get { return quantity; }
            set
            {
                quantity = value;
                OnPropertyChange("Quantity");
                //Force Subtotal to be updated
                OnPropertyChange("SubTotal");
            }
        }
        string description;
        public string Description
        {
            get { return description; }
    
            set
            {
                description = value;
                OnPropertyChange("Description");
            }
        }
        decimal price;
        public decimal Price
        {
            get { return price; }
            set
            {
                price = value;
                OnPropertyChange("Price");
                //Force Subtotal to be updated
                OnPropertyChange("SubTotal");
            }
        }
        public decimal SubTotal
        {
            get { return Quantity * Price; }
        }
    
        public static List<Produts> ProductList
        {
            get
            {
                return new List<Produts>();
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChange(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    

    这里是XAML:

    <DataGrid ItemsSource="{Binding Path=ProductList}" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="ID" Binding="{Binding Path= ProductID}"/>
                    <DataGridTextColumn Header="Quantity" Binding="{Binding Path=Quantity}"/>
                    <DataGridTextColumn Header="Description" Binding="{Binding Path=Description}"/>
                    <DataGridTextColumn Header="Price" Binding="{Binding Path=Price}"/>
                    <DataGridTextColumn Header="Subtotal" Binding="{Binding Path=SubTotal, Mode=OneWay}"/>
                </DataGrid.Columns>
            </DataGrid>
    

    这一行在window的构造器中

    base.DataContext = new Produts();
    
        2
  •  1
  •   treehouse    14 年前

    它与列表或可观察的集合无关。所有的收集工作都是通知 收集 已更改(例如添加新项目、删除项目等)。应该通知UI某些字段已更改的是单个项本身。可以使用依赖属性或实现InotifyPropertyChanged来使用WPF属性系统。