【问题标题】:How do I notify the container object that a property has changed from the object being changed?如何通知容器对象某个属性已从正在更改的对象中更改?
【发布时间】:2016-10-22 07:15:40
【问题描述】:

背景:本质上,我正在使用自定义 Android 渲染器在 Xamarin.Forms 中创建一个 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 改变了)并且自身无效,在屏幕上重绘。

有没有一种好方法可以通知包含对象该属性已从属性本身更改?还是我在处理这个问题时都错了?

【问题讨论】:

  • 这可能有点幼稚,但你看过data binding guide吗?您可以创建一个模型,该模型将能够提高 PropertyChanged,这听起来像您想要的,在这里。

标签: c# .net xamarin xamarin.forms inotifypropertychanged


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-19
    • 2013-05-01
    • 1970-01-01
    • 2020-09-18
    • 2023-02-20
    • 1970-01-01
    • 2012-06-15
    • 2012-05-07
    相关资源
    最近更新 更多