gpt4 book ai didi

c# - 我如何通知容器对象一个属性已经从被改变的对象中改变了?

转载 作者:太空宇宙 更新时间:2023-11-03 12:44:08 25 4
gpt4 key购买 nike

背景:本质上,我正在使用自定义 Android 渲染器在 Xamarin.Forms 中制作一个网格系统,因为内置的网格实现对于我们正在尝试做的事情来说太慢了(它无法处理同时滚动 100,000 个单元格,这是我们需要的)。我已经通过过度耦合成功地做到了这一点,现在我正在按照我的主管要求的方式进行重构,但我遇到了一个问题。

场景:

//In Xamarin.Forms project
class GridItems : BindableObject {
//Handles/contains all logic to how this grid will be laid out and its children
}

//In Xamarin.Forms project
class Grid : View {
GridItems Source { get; set; }
}

//In Xamarin.Android project
class GridRenderer {
OnElementPropertyChanged() {
//Here I can check what properties inside Grid changed
}
}

这显然非常简单,但是以这种方式设置的原因是您可以简单地子类化 GridItems 来修改网格接受的项目类型,单元格/列的字符串值应该是什么,等等。并重用 Grid 和 GridRenderer 类。

问题:

当 GridItems 在自身内部被修改时,我需要通知 Grid.GridItems。 GridItems 可以引发它的属性更改事件,但是只会针对本地属性触发。我基本上需要 GridItems 能够告诉 Grid“我已经改变,引发你的 GridItems 属性改变事件”,这样 GridRenderer 就可以看到 GridItems 已经改变(因为 Grid 改变了)并且使自己失效,在屏幕上重绘。

是否有一种好方法可以通知包含对象该属性已从属性本身更改?还是我完全错误地解决了这个问题?

最佳答案

所以我设法找到了一种可行的方法来做到这一点,但它可能不适用于大多数 future 的人,因为它非常适合我的场景。

本质上,Grid 和 GridItems 都共享一个 ViewModel(页面 ViewModel)。这意味着当 GridItems 的绑定(bind)被修改时,ViewModel 可以简单地通过绑定(bind)通知 Grid,所以它更像是 ViewModel 负责。

我在 Grid 中创建了一个可绑定(bind)的 bool 值,称为“Invalidate”。每当 ViewModel 修改 GridItems 的子绑定(bind)时,它都会通过将 Invalidate 绑定(bind)设置为 true 来修改它。

现在在自定义渲染器上,每当为 Grid 触发 ElementPropertyChange 时,它​​都会检查 Invalidate 是否被触发并且 Invalidate 现在设置为 true。在这种情况下,它只是简单地将元素中的 Invalidate 重置为 false,然后对自身调用 Invalidate(强制 Draw 事件在可能的情况下重新触发并重新加载屏幕)。

关于c# - 我如何通知容器对象一个属性已经从被改变的对象中改变了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37932575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com