ObservableCollection.CollectionChanged 未触发

2024-02-24

我有以下界面:

当一个项目被添加到DataGrid, the Total column将根据(价格*数量)更新,总计TextBox还将添加所有添加的行的总数。

但是,当我更改行的数量时,Total column更新,但总计TextBox才不是。

这是我的代码,提前致谢。

 public partial class pgCheckout : Page {

    ObservableCollection<SaleItem> items = new ObservableCollection<SaleItem>();

    public pgCheckout() {
        InitializeComponent();
        dgItems.ItemsSource = items;
        dgItems.Loaded += SetMinWidths;
        items.CollectionChanged += setTotal;
    }

    public void setTotal(object source, EventArgs e) {
        decimal total = 0;
        foreach(SaleItem i in items) {
            total += i.Total;
        }

        txtTotal.Text = total.ToString();
    }


    public void SetMinWidths(object source, EventArgs e) {
        foreach (var column in dgItems.Columns) {
            if (column.DisplayIndex != 0) {
                column.MinWidth = column.ActualWidth;
                column.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
            }
        }
    }

    private void btnRemove_Click(object sender, RoutedEventArgs e) {
        items.RemoveAt(dgItems.SelectedIndex);
    }

    private void btnAdd_Click(object sender, RoutedEventArgs e) {
        bool exist = false;
        foreach (SaleItem i in items) {
            if (i.ItemID.Equals(txtItemID.Text))
                exist = true;
        }

        if (exist) {
            lblErr.Content = "Item already exist";
            txtItemID.Text = "";
        }

        else {

            using (var db = new PoSEntities()) {
                var query = from i in db.Items
                            where i.ItemID.Equals(txtItemID.Text.Trim())
                            select i;
                var itm = query.FirstOrDefault();
                if (itm == null) {
                    lblErr.Content = "Invalid Item";
                    txtItemID.Text = "";
                }
                else {
                    txtItemID.Text = "";
                    lblErr.Content = "";
                    items.Add(new SaleItem() {
                        Num = items.Count + 1,
                        ItemID = itm.ItemID,
                        Name = itm.Name,
                        Price = decimal.Round(itm.Price, 2, MidpointRounding.AwayFromZero),
                        Quantity = 1,
                    });
                }
            }
        }
    }

    private void txtItemID_KeyUp(object sender, KeyEventArgs e) {
        if (e.Key == System.Windows.Input.Key.Enter) {
            btnAdd_Click(txtItemID, e);
        }
    }
}

class SaleItem : INotifyPropertyChanged {
    public int Num { get; set; }
    public string ItemID { get; set; }
    public string Name { get; set; }

    private decimal price;
    public decimal Price {
        get { return price; }
        set {
            this.price = value;
            OnPropertyChanged("Total");
        }
    }
    public int quantity;
    public int Quantity {
        get { return quantity; }
        set {
            this.quantity = value;
            OnPropertyChanged("Total");
        }
    }

    public decimal Total {
        get { return decimal.Round(Price * Quantity, 2, MidpointRounding.AwayFromZero); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName) {
        var handler = PropertyChanged;
        if (handler != null) {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

ObservableCollection.CollectionChanged当从集合中添加或删除某些内容时触发,而不是更新单个成员。

...
else 
{
    txtItemID.Text = "";
    lblErr.Content = "";
    SaleItem newItem = new SaleItem() {
                    Num = items.Count + 1,
                    ItemID = itm.ItemID,
                    Name = itm.Name,
                    Price = decimal.Round(itm.Price, 2, MidpointRounding.AwayFromZero),
                    Quantity = 1 };
     newItem.PropertyChanged += 
             new PropertyChangedEventHandler(newSaleItem_PropertyChanged);

    items.Add(newItem);
 }
 ...

这就是newSaleItem_PropertyChanged:

void newSaleItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    setTotal(null, null);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ObservableCollection.CollectionChanged 未触发 的相关文章

  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐