Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通知容器对象某个属性已从正在更改的对象更改?_C#_.net_Xamarin_Xamarin.forms_Inotifypropertychanged - Fatal编程技术网

C# 如何通知容器对象某个属性已从正在更改的对象更改?

C# 如何通知容器对象某个属性已从正在更改的对象更改?,c#,.net,xamarin,xamarin.forms,inotifypropertychanged,C#,.net,Xamarin,Xamarin.forms,Inotifypropertychanged,Background:基本上,我正在用Xamarin.Forms制作一个网格系统,其中包含定制的Android渲染器,因为内置的网格实现对于我们正在尝试做的事情来说太慢了(它无法处理同时滚动的100000个单元格,这是我们需要的)。我已经通过过度耦合成功地做到了这一点,现在我正按照主管要求的方式进行重构,我遇到了一个问题 场景: //In Xamarin.Forms project class GridItems : BindableObject { //Handles/contain

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

场景

//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类

问题

//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.GridItems。GridItems可以引发它的property changed事件,但是该事件只针对本地属性触发。我基本上需要GridItems能够告诉Grid“我已更改,引发您的GridItems属性更改事件”,以便GridRenderer可以看到GridItems已更改(自Grid更改)并使其自身无效,在屏幕上重新绘制


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

所以我设法找到了一种可行的方法来解决这个问题,但它可能对大多数未来的人都不起作用,因为它非常适合我的场景

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

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


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

这可能有点幼稚,但您是否已查看了?您可以创建一个模型,该模型将能够提高
PropertyChanged
,这听起来像您想要的。