背景:从本质上讲,我正在Xamarin中构建一个带有自定义Android渲染器的Grid系统,因为内置的Grid实现对于我们尝试执行的操作来说太慢了(它无法处理需要同时滚动的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更改以来)并使其自身无效,然后在屏幕上重新绘制。

是否有一种很好的方法来通知包含对象该属性已从属性本身更改?还是我解决这个问题都错了?

最佳答案

因此,我设法找到了一种可行的方法来执行此操作,但是对于大多数未来的人来说,它可能不起作用,因为它非常适合我的情况。

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

我在Grid中创建了一个可绑定的布尔值,称为“ Invalidate”。每当ViewModel修改GridItems的子级绑定时,它将通过将Invalidate绑定设置为true来进行修改。

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

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

10-13 06:23