Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测绑定到DataGrid以更新WPF (MVVM)中其他集合的集合(元素)中的更改

检测绑定到DataGrid以更新WPF (MVVM)中其他集合的集合(元素)中的更改
EN

Stack Overflow用户
提问于 2021-04-07 11:32:25
回答 1查看 89关注 0票数 0

响应性UI设计:DataGrid输入自动导致更改(MVVM)

我正在尝试创建一个简单的应用程序,在这个应用程序中,我有一个图表工具,它将集合接受为要绘制的系列。我的计划是有一个输入DataGrid,它绑定到可以手动填充的集合。

根据DataGrid中的值,我想同时填充一个不同的集合,它表示正在绘制的任何函数的定积分,换句话说,是一个不同的函数,它显示输入函数和x轴之间的区域。

在更新DataGrid时,我希望使用MVVM响应地更新图表,以显示输入数据和输出数据中的更改。

A.应用部件(模拟和结构)

我创建了一个包含到目前为止我的实现的gist。

1.主要部分

简而言之,应用程序有以下组件:

  • 具有X和Y属性的Coordinate<T, U> (并使用INotifyPropertyChanged)
  • 绘图用ObservableCollection<Coordinate<double, double>>
  • 用于执行数值方法的NumericalCalculator

2.转换器

在WPF聊天室中,Maverik建议我可以使用值转换器让WPF完成繁重的工作,因此我编写了以下转换器:

  • CoordinateSeriesToStringConverter将坐标集合转换为字符串,其中所有坐标都由逗号分隔
  • FunctionToEquallySpacedConverter试图将一个坐标集合转换为一个新集合,其中包含一些等距坐标的n数。
  • FunctionToIntegralConverter试图将输入函数(坐标集合)集成到两个边界之间的数值积分(出于测试目的,目前尚未集成)。

我的实际问题是:如何检测DataGrid的项源元素中的更改?

我已经选择了值转换路由,但事实证明,即使在绑定的INotifyPropertyChanged元素上实现了ObservableCollection,这些更改也不会激活转换器。

我已经用一种不同的方法从sparedev那里得到了一个很好的答案,我可能也会尝试,但我仍然好奇如何解决值转换问题。我敢肯定,如果我把这个问题解决了,两种选择都是同样可行的。

更新:我尝试过sparedev的方法,但即使使用INotifyPropertyChanged,从UI中操作DataGrid的项也不会引发任何新事件。添加新行或删除它们会引发CollectionChanged事件,但不幸的是,仅这一点还不允许我对情节进行响应性更新。

EN

回答 1

Stack Overflow用户

发布于 2021-04-07 13:07:57

让我们在CollectionChanged事件上注册并更新结果集合,如下所示。

代码语言:javascript
运行
AI代码解释
复制
    public MainViewModel()
    {
      InputCollection.CollectionChanged += Items_CollectionChanged;
    }

    private void Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
      if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
      {
        foreach (var i in e.NewItems)
        {
          var c = i as Coordinate<double, double>;
          ResultCollection.Add(c);
          c.PropertyChanged += Item_PropertyChanged;
        }
      }

      if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
      {
        foreach (var i in e.OldItems)
        {
          var c = i as Coordinate<double, double>;
          ResultCollection.Remove(c);
          c.PropertyChanged += Item_PropertyChanged;
        }
      }
    }

    private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
      var c = sender as Coordinate<double, double>;
      Console.WriteLine(c.X + " " + c.Y);
    }

可能是您的坐标类应该实现INotifyPropertyChanged接口。在设置X或Y属性时,应引发PropertyChanged。

代码语言:javascript
运行
AI代码解释
复制
  public class Coordinate<T, U> : IComparable<Coordinate<T, U>>, INotifyPropertyChanged
    where T : IComparable<T>
    where U : IComparable<U>
  {
    public Coordinate() { }
    public Coordinate(T x, U y)
        => (X, Y) = (x, y);

    public event PropertyChangedEventHandler PropertyChanged;

    private T _X;
    public T X
    {
      get => _X;
      set
      {
        if (value.CompareTo(_X) != 0)
        {
          _X = value;
          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(X)));
        }
      }
    }

    private U _Y;
    public U Y
    {
      get => _Y;
      set
      {
        if (value.CompareTo(_Y) != 0)
        {
          _Y = value;
          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Y)));
        }
      }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66992997

复制
相关文章
【Python】集合 set ② ( 集合常用操作 | 集合中添加元素 | 集合中移除元素 | 集合中随机取出元素 )
集合添加元素代码示例 : 原集合中有两个 Tom 字符串 , 只保留后面的 Tom 字符串 ; 添加元素时 , 添加 Trump 元素 , 原集合中没有该元素 , 添加成功 ; 有添加 Tom 元素 , 此时原集合中存在该元素 , 本次添加 Tom 元素失败 ;
韩曙亮
2023/10/11
3300
【Python】集合 set ② ( 集合常用操作 | 集合中添加元素 | 集合中移除元素 | 集合中随机取出元素 )
WPF 得到子指定元素方法和得到指定子元素集合方法MvvM得到焦点
public class UIHelper { /// <summary> /// 在Visual里找到想要的元素 /// childName可为空,不为空就按名字找 /// </summary> public static T FindChild<T>(DependencyObject parent, string childName) where T : DependencyObject
lpxxn
2018/01/31
1K0
siblings() 获得匹配集合中每个元素的同胞
如果给定一个表示 DOM 元素集合的 jQuery 对象,.siblings() 方法允许我们在 DOM 树中搜索这些元素的同胞元素,并用匹配元素构造一个新的 jQuery 对象。
全栈程序员站长
2021/10/20
1.5K0
迭代器模式(控制访问集合中的元素)
现在我们需要思索,JDK是怎么做到这一切的?现在让我们先利用迭代器实现一个数组类型Array,这个类型需要支持添加、移除、遍历操作。
幺鹿
2018/08/21
1.4K0
迭代器模式(控制访问集合中的元素)
【Groovy】集合遍历 ( 使用集合的 findAll 方法查找集合中符合匹配条件的所有元素 | 代码示例 )
在上一篇博客 【Groovy】集合遍历 ( 使用集合的 find 方法查找集合元素 | 闭包中使用 == 作为查找匹配条件 | 闭包中使用 is 作为查找匹配条件 | 闭包使用 true 作为条件 | 代码示例 ) 中 , 介绍了使用 find 方法 , 获取集合中第一个符合 闭包匹配条件的元素 ;
韩曙亮
2023/03/30
2.6K0
【Groovy】集合遍历 ( 使用集合的 findAll 方法查找集合中符合匹配条件的所有元素 | 代码示例 )
UWP 和 WPF 不同,ListView 中绑定的集合修改顺序时,UI 的刷新规则
2017-10-20 00:14
walterlv
2018/09/18
2.3K0
UWP 和 WPF 不同,ListView 中绑定的集合修改顺序时,UI 的刷新规则
java中的集合
ArrayList和LinkedList的异同? 答:二者都线程不安全,相对线程安全的Vector,执行效率高。此外,ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。
全栈程序员站长
2022/07/18
1.6K0
java中的集合
Java中的集合
Java提供了一套实现了Collection接口的标准集合类。其中一些是具体类,这些类可以直接拿来使用,而另外一些是抽象类,提供了接口的部分实现。
shimeath
2022/05/05
1.6K0
Java中的集合
Python中的集合
Python中的集合专门用于存储信息,存储的元素无序且不能重复,它用一对花括号{}定义,数据之间用逗号隔开。
阿黎逸阳
2020/09/08
1K0
python中的集合
可变集合(set):可添加和删除元素,非可哈希的,不能用作字典的键,也不能做其他集合的元素
py3study
2020/01/10
9300
C# WPF数据绑定方法以及重写数据模板后数据绑定
本文将会介绍WPF如何实现前后端数据绑定和在进行数据绑定时常用的方法和类以及对于DataGrid、ListView这样的控件重写数据模板后控件如何进行数据绑定。
郑子铭
2023/08/29
9320
C# WPF数据绑定方法以及重写数据模板后数据绑定
WPF DataGrid 直接绑定数据
初学WPF 以前用的Winform中的 DatagridView就是直接绑定Datasource 就ok了
zls365
2020/12/15
3.7K0
Python中的集合
集合(Set)是简单对象的无序集合(Collection)。当集合中的项目存在与否比起次序或其出 现次数更加重要时,我们就会使用集合。 通过使用集合,你可以测试某些对象的资格或情况,检查它们是否是其它集合的子集,找到 两个集合的交集,等等。
benym
2022/07/14
5890
Java中的集合
开发中会使用大量相同数据类型的情况。如果使用数组来解决问题 1. 数组能够使用的方法非常少,功能方法需要程序员自己完成。 2. 数据类型单一化,不支持多种情况。 3. 数组容量不可以更改。
用户7073689
2020/03/18
1.4K0
【Groovy】集合遍历 ( 调用集合的 any 函数判定集合中是否有指定匹配规则的元素 | 代码示例 )
集合的 any 函数 , 用于判断集合中是否有 满足闭包中的条件 的元素 , 返回一个布尔值 , true 或者 false ;
韩曙亮
2023/03/30
1.3K0
【Groovy】集合遍历 ( 调用集合的 any 函数判定集合中是否有指定匹配规则的元素 | 代码示例 )
【Groovy】集合遍历 ( 操作符重载 | 集合中的 “ << “ 操作符重载 | 使用集合中的 “ << “ 操作符添加一个元素 | 使用集合中的 “ << “ 操作符添加一个集合 )
对集合使用 " << " 运算符号 , 该符号右边的值为 集合元素值 , 该操作相当于调用了 Collection 的 leftShift 方法 ;
韩曙亮
2023/03/30
2.9K0
【Groovy】集合遍历 ( 操作符重载 | 集合中的 “ << “ 操作符重载 | 使用集合中的 “ << “ 操作符添加一个元素 | 使用集合中的 “ << “ 操作符添加一个集合 )
WPF【框架学习】MVVM初探(经典)
之前接触并使用过MVC,Model - View - Controller的模式,页面和代码分离的写法,MVVM:Model - View - ViewModel,和WPF很好的进行结合,View负责界面,主要是写.xaml的文件,Model是一些实体类,ViewModel是关键,意思是View的Model,View需要什么,ViewModel提供什么,如果将View理解为界面,Model和ViewModel以及Service等理解为后台的话,那么界面和后台是没有任何关系的,界面开发人员只要告诉后台人员需要哪些对象\属性,就可以进行开发了,二者之间的结合通过Binding操作进行绑定,解耦效果优于MVC,架构图如下:
zls365
2021/02/26
2.6K0
QT5中操作QWidgetItem下的集合元素
一、布局 image.png 二、引入头文件 image.png 三、声明槽函数 image.png 四、实现槽函数  image.png 五、添加信号与槽的连接 image.png 版权声明:此文为本站源创文章[或由本站编辑从网络整理改编], 转载请备注出处: [狂码一生]http://www.sindsun.com/article-details-69.html [若此文确切存在侵权,请联系本站管理员进行删除!]
Sindsun
2018/07/06
7690
MVVM模式和在WPF中的实现(一)MVVM模式简介
之前一直用Winform。刚开始看了下感觉跟Winform区别不大,控件可以拖进去,选中了控件属性面板可以设置属性、事件面板可以监听事件,后台代码处理事件,一切都那么的熟悉。XAML布局也跟Android布局很像,所以没学习就直接开始了,觉得摸索摸索基本就差不多了吧。结果各种不适应,拖控件拖进去后总是调整不好显示方式,控件在后台代码中操作找不到方法,对于WPF介绍的各种特点也毫无体会,总想着换回去。后来看了刘铁猛的《深入浅出WPF》,里面说WPF就要用WPF的方式来开发。这才认真开始学WPF。现在控件面板和属性面板都已经用的很少了,界面布局基本全部用代码搞定,感觉任何一个细节都能控制到。再后来接触到了MVVM,更加体会到了以MVVM模式开发WPF带来的好处。现在除非要求已经不再用Winform了,小工具和测试程序直接在后台写代码,复杂一点的需要长期使用和维护的用MVVM模式。这个系列的文章主要写一下自己对MVVM的理解和核心部分的简易实现方式。
zls365
2021/01/28
1.6K0
WPF 属性变动后的业务处理及恢复原始值的方法
本文主要介绍在 WPF 中,当属性变动后,如何依据是哪个属性变动了,以及其变动的值的情况来进行相应业务处理的推荐的方式;以及如果要恢复属性的原始值,可以怎么做。
独立观察员
2023/02/26
3.5K0
WPF 属性变动后的业务处理及恢复原始值的方法

相似问题

WPF MVVM DataGrid ItemsSource绑定到不同的集合

10

在WPF MVVM模型中将集合集合绑定到datagrid源

10

将集合集合绑定到DataGrid的WPF

11

WPF DataGrid不绑定到集合

30

WPF DataGrid -绑定到“cells”的集合

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档