如果在 Windows 8.1 应用程序中更新了子 ViewModel 之一的值,如何更新父 ViewModel 中的值

2024-03-22

我有一个 Windows 8.1 应用程序,其父视图模型和子视图模型具有以下关系

父视图模型

class ParentViewModel {
    private double _parentAmount;
    public double parentAmount
    {
        get { return _parentAmount; }
        set
        {
            if (value != _parentAmount)
            {
                _parentAmount = value;
                NotifyPropertyChanged("parentAmount");
            }
        }
    }

    private ObservableCollection<ChildViewModel> _children;
    public ObservableCollection<ChildViewModel> children
    {
        get { return _children; }
        set
        {
            if (value != _children)
            {
                _children = value;
                NotifyPropertyChanged("children");
            }
        }
    }
}

子视图模型

class ChildViewModel {
    private double _ChildAmount;
    public double ChildAmount
    {
        get { return _ChildAmount; }
        set
        {
            if (value != _ChildAmount)
            {
                _ChildAmount = value;
                NotifyPropertyChanged("ChildAmount");
            }
        }
    }
}

在 XAML 中,有一个 TextBlock 绑定到“ParentAmount”,然后有一个 ListView 绑定到 Observable 集合“Children”。 ListView 的 Itemtemplate 是一个带有 TextBox 的数据模板,可以通过两种方式绑定到“ChildAmount”。用户可以修改子TextBox中的值

现在,我的要求是当用户修改子金额之一时,动态更新父金额及其所有子金额的总和。我该如何实现这一目标?

为了说明目的,我简化了上面粘贴的代码示例,ChildViewModel 具有比可见的功能更多的功能,因此我无法用 double 列表替换 ChildViewModel 的 ObservableCollection。

如果有人能指出我正确的方向,我将非常高兴。提前致谢。


只需添加很少的量,就可以达到目的。 具体的更改是为 ObservableCollection 中的每个子对象添加属性更改处理程序。

请注意,这是一个让您走上正确轨道的粗略示例 - 我还没有取消事件处理程序,并且我根据子项的任何更改重新计算父项金额(即,我不检查是否是 ChildAmount 发生了更改) ,这意味着您最终会采取比必要的更多的行动)。我也没有放入任何代码来处理 ObservableCollection 内容的更改,因此如果向其中添加新项目,它们将不会附加属性更改事件处理程序 - 这对您自己来说很简单。

请注意我对 BaseViewModel 的使用 - 这只是一个很好的实践,它使您无需在每个需要它的类上重新实现 INotifyPropertyChanged 接口。

class ParentViewModel : BaseViewModel
{
    private double _parentAmount;
    public double parentAmount
    {
        get { return _parentAmount; }
        set
        {
            if (value != _parentAmount)
            {
                _parentAmount = value;
                NotifyPropertyChanged("parentAmount");
            }
        }
    }

    private ObservableCollection<ChildViewModel> _children;
    public ObservableCollection<ChildViewModel> children
    {
        get { return _children; }
        set
        {
            if (value != _children)
            {
                _children = value;
                foreach (var child in _children)
                    child.PropertyChanged += ChildOnPropertyChanged;
                NotifyPropertyChanged("children");
            }
        }
    }

    private void ChildOnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
    {
        parentAmount = children.Sum(p => p.ChildAmount);
    }
}

class ChildViewModel : BaseViewModel
{
    private double _ChildAmount;
    public double ChildAmount
    {
        get { return _ChildAmount; }
        set
        {
            if (value != _ChildAmount)
            {
                _ChildAmount = value;
                NotifyPropertyChanged("ChildAmount");
            }
        }
    }
}


public class BaseViewModel : INotifyPropertyChanged
{
    protected void NotifyPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

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

如果在 Windows 8.1 应用程序中更新了子 ViewModel 之一的值,如何更新父 ViewModel 中的值 的相关文章

随机推荐

  • msbuild,如何设置环境变量?

    我正在尝试使用项目文件 例如 vcxproj 设置环境变量 我查看了属性函数 但似乎没有这样的功能 我知道有一种方法可以检索环境变量 但找不到如何设置它 我觉得应该有办法在项目文件中设置环境变量 从 MSBuild v4 0 开始 编码任务
  • 无法在 Vuejs 2 中使用 vuetable-2 检索数据

    我是 Vuejs 2 的新手 目前正在做一个项目 我在用着vuetable 2形成一个数据表Vuejs 2 我目前面临一个问题 无法使用属性 api url vuetable 2 检索数据 但是 我可以使用 Axios 和全局 Axios
  • 使用 JS 操作 HTML 中的 SVG

    我在 html 嵌入的 svg 图像中使用 javascript 构建 svg 元素时遇到问题 我创建了两个应该完全相同的文件 但其中一个是用 js 构建的 SVG html
  • 如何让 gradle 输出每个依赖项的依赖项哈希

    我有生以来第一次看到这样的情况 gradle compileJava check在本地运行良好 但是当我尝试使用 bitbucket 管道运行相同的命令时 我得到NoSuchClassDefError I do gradle user lo
  • 使用 ADO 在 IntraWeb 上共同初始化错误

    已经询问了邪恶交换 但一如既往 这没有帮助 我今天遇到这个问题 使用 IntraWeb 创建独立的 Web 应用程序时 当我尝试在浏览器中测试应用程序的会话时 我在 IDE 中遇到此异常 第一次机会例外 价格为 7C812A6B 异常类 E
  • 仅提取特定页面中使用的 css

    假设您有一个动态生成的网站 过去和现在都有太多人参与其中 并且您现在拥有一组包含超过 20 000 行 CSS 的共享样式表 它根本没有组织 有一些基于类和 id 的选择器 但也有太多基于标签的选择器 然后假设您有 100 个通过某个控制器
  • 按 R 中相似结果分组

    我想对相似的结果 不是唯一的 进行分组 但我不知道该怎么做 我的意思是 我有一个名为 name 的列的 df 它具有类似的结果 例如 ARPO ARPO S L ARPO SL 等 name address ARPO street 1 AR
  • sqoop导入或导出期间的不良记录处理

    我查看了 sqoop 导出操作提供的选项 但找不到任何处理不良记录的选项 例如 在大量记录中 偶尔可能会出现一个字符 而该字符应该是数字 有没有一种方法可以在 sqoop 中处理这些情况 而不会导致作业失败并在文件中提供错误记录 Sqoop
  • 如何将VM选项添加到jar文件中?

    我需要添加 Djava security policy myPolicyFile这样我的 RMI jar 就可以工作了 或者还有其他方法可以运行吗 如果你想在有人使用启动你的 jar 时添加 Djava jar 这是不可能的 因为不可能在
  • 如何制作可扩展的表格视图单元格?

    我想要一个表格视图单元格 当您点击它时 它的高度会增加以显示一些描述文本 当您再次点击它时 它会切换回较低的版本 这可能吗 如果可能的话 我将如何实现它 提前致谢 Use CGFloat tableView UITableView tabl
  • 使用 Spring MVC 框架清理用户输入

    我正在使用 spring mvc 框架开发 Web 应用程序 我想知道是否有任何最好的方法来清理用户输入或通用方法来清理 springs 中的所有用户输入以避免 XSS 和 Sql 注入攻击 您可以使用Filters在 Spring 框架中
  • 什么是 kthreadd 进程和子进程以及它与 init 和子进程有何不同

    我想知道什么是kthread以及为什么它不占用任何内存并且没有打开的文件 我编写了一些代码 它将简单地以父子树格式打印当前正在运行的进程的 PID 以及一些附加信息 例如使用的 VMZ RSS 线程 打开文件 PID 2 的所有子进程命名为
  • 垂直于给定点的直线

    如何从给定点在线段上绘制垂线 我的线段定义为 x1 y1 x2 y2 如果我从点 x3 y3 绘制垂直线并且它与点 x4 y4 上的线相交 我想找出这个 x4 y4 我帮你解了方程 k y2 y1 x3 x1 x2 x1 y3 y1 y2
  • Jquery $() - 它返回什么,$()[0] 是什么?

    我正在看一个如何使用 jqGrid 的示例 它是一个 jQuery 插件 它在 id 为 list 的 div 中绘制网格 它创建网格 list jqGrid 但它填充了网格 list 0 addJSONData 我一直在网上寻找关于 jQ
  • 使用 VueJS 生成从 1900 年到当前年份的年份

    我正在使用 VueJS 创建注册表单 用户必须输入他 她的出生日期 那么 我如何生成从 1900 年到当前年份的年份
  • 给定 n,找到相加得到 n 的最大数

    oracle面试时问的问题 例如 如果我的输入是6 那么 5 1 6 且 2 4 2 6 且 2 3 2 1 6 且 3 所以 最终答案应该是3 即需要3 2 1才能得到总和6 Note 不允许数字重复 即1 1 1 1 1 1 6 我用递
  • 检查neo4j图中是否存在节点

    NOTE 我让这成为几个问题 而不是我问的简单问题 所以我将后续问题分解为他们自己的问题here https stackoverflow com questions 22867148 creating unique relationship
  • 如何在同一行中滚动自定义布局和惰性列,就好像它们是一个组件一样

    我有一行包含一个惰性列和一个自定义布局 惰性列包含时间和包含已定位事件的自定义布局 它们具有不同的滚动状态 因此它们不会一起滚动 我怎样才能解决这个问题 因为我需要一个惰性列来跟踪我使用布局信息的日期 Composable fun Sche
  • 显示形状文件

    I have a shapefile http www arcgis com home item html id 3fd6eb2de569477ca83b2b65da8ecb6f that I want to display I tried
  • 如果在 Windows 8.1 应用程序中更新了子 ViewModel 之一的值,如何更新父 ViewModel 中的值

    我有一个 Windows 8 1 应用程序 其父视图模型和子视图模型具有以下关系 父视图模型 class ParentViewModel private double parentAmount public double parentAmo