C# 绑定到二维数组赢得';属性更改后无法更新

C# 绑定到二维数组赢得';属性更改后无法更新,c#,wpf,binding,multidimensional-array,inotifypropertychanged,C#,Wpf,Binding,Multidimensional Array,Inotifypropertychanged,我的网格包含一个ItemsControl,它绑定到一个二维单元格数组 此ItemsControl ItemTemplate包含另一个启用此二维绑定的ItemsControl 最终,我的二维数组中的每个单元格都显示为一个椭圆。每个椭圆的颜色都绑定到单元格的枚举属性 当我第一次分配二维数组并设置绑定的dataContext时,它工作得很好 但是,在更新数组并引发PropertyChanged事件后,绑定不会响应此事件 我已经读过一些关于这个bug的文章,其中一种可能是我的更新过程只更新每个单元格的e

我的网格包含一个ItemsControl,它绑定到一个二维单元格数组

此ItemsControl ItemTemplate包含另一个启用此二维绑定的ItemsControl

最终,我的二维数组中的每个单元格都显示为一个椭圆。每个椭圆的颜色都绑定到单元格的枚举属性

当我第一次分配二维数组并设置绑定的dataContext时,它工作得很好

但是,在更新数组并引发PropertyChanged事件后,绑定不会响应此事件

我已经读过一些关于这个bug的文章,其中一种可能是我的更新过程只更新每个单元格的enum属性。这意味着二维数组不会在每次更新时重新分配,而是更改其单元格内部数据

在引发PropertyChanged之前,我确实尝试过重新分配数组,并且绑定工作正常

这可能是原因吗?我真的应该在每次更新时重新分配或更改阵列的地址吗

下面是我的绑定Xaml:

<ItemsControl Name="Board" ItemTemplate="{DynamicResource DataTemplate_Level1}" 
                      ItemsSource="{Binding 
                                    Path=GameBoard, 
                                    UpdateSourceTrigger=PropertyChanged,
                                    diag:PresentationTraceSources.TraceLevel=High}" />    
这是手动属性更改提升:

protected void raisePropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

}

我在WPF中遇到过许多情况,需要在属性设置器之外引发
PropertyChanged
事件。我相信你的处境很可能就是其中之一。更改实际单元格值不会影响数组属性,也不会引发
PropertyChanged
事件

在这些情况下,不仅完全可以接受,甚至有必要手动引发
PropertyChanged
事件。我的意思是:

Array[0,1] = newValue;
NotifyPropertyChanged("Array"); // Your method may have a different name
试试这个,如果有帮助请告诉我。

来自MSDN文档:

Note that the ItemsSource property supports OneWay binding by default.
因此,您必须将
绑定模式设置为
双向

<ItemsControl Name="Board" ItemTemplate="{DynamicResource DataTemplate_Level1}" 
ItemsSource="{Binding 
Path=GameBoard, Mode=Two-Way,
UpdateSourceTrigger=PropertyChanged,
diag:PresentationTraceSources.TraceLevel=High}" /> 

我想回答我自己的问题:

我最基本的错误是INotifyPropertyChanged的用法。 因为我使用的是集合的绑定,所以我应该使用INotifyCollectionChanged接口


为了解决我的问题,我为我的二维数组创建了一个ViewModel。此ViewModel实现ICollection和INotifyCollectionChanged接口,包装我的二维数组,因此-此ViewModel能够正确地“插入”到绑定中。

我已经手动将此事件从属性的setter中引发。。。请参阅问题的编辑。谢谢。谁在“更新”以及在哪里?您是否在单个
单元格中
raisePropertyChanged
?据我所知,双向绑定模式允许UI更改到我的源集合中。这不是我想要达到的。如果您感兴趣,我已经发布了我在进一步研究后找到的解决方案。谢谢:)请注意使用
INotifyCollectionChanged
,它仅在集合本身更改时触发,而不是在集合中对象的属性更改时触发。是的,您是对的。在我的例子中,只有在我更新了集合中多个项目的多个属性之后,UI才会发生更改,这就是我决定创建自己的自定义集合ViewModel的原因,正如我在回答中提到的那样。此ViewModel会在定制的时间触发CollectionChanged。再次感谢:)
<ItemsControl Name="Board" ItemTemplate="{DynamicResource DataTemplate_Level1}" 
ItemsSource="{Binding 
Path=GameBoard, Mode=Two-Way,
UpdateSourceTrigger=PropertyChanged,
diag:PresentationTraceSources.TraceLevel=High}" />