C# 绑定到二维数组赢得';属性更改后无法更新
我的网格包含一个ItemsControl,它绑定到一个二维单元格数组 此ItemsControl ItemTemplate包含另一个启用此二维绑定的ItemsControl 最终,我的二维数组中的每个单元格都显示为一个椭圆。每个椭圆的颜色都绑定到单元格的枚举属性 当我第一次分配二维数组并设置绑定的dataContext时,它工作得很好 但是,在更新数组并引发PropertyChanged事件后,绑定不会响应此事件 我已经读过一些关于这个bug的文章,其中一种可能是我的更新过程只更新每个单元格的enum属性。这意味着二维数组不会在每次更新时重新分配,而是更改其单元格内部数据 在引发PropertyChanged之前,我确实尝试过重新分配数组,并且绑定工作正常 这可能是原因吗?我真的应该在每次更新时重新分配或更改阵列的地址吗 下面是我的绑定Xaml:C# 绑定到二维数组赢得';属性更改后无法更新,c#,wpf,binding,multidimensional-array,inotifypropertychanged,C#,Wpf,Binding,Multidimensional Array,Inotifypropertychanged,我的网格包含一个ItemsControl,它绑定到一个二维单元格数组 此ItemsControl ItemTemplate包含另一个启用此二维绑定的ItemsControl 最终,我的二维数组中的每个单元格都显示为一个椭圆。每个椭圆的颜色都绑定到单元格的枚举属性 当我第一次分配二维数组并设置绑定的dataContext时,它工作得很好 但是,在更新数组并引发PropertyChanged事件后,绑定不会响应此事件 我已经读过一些关于这个bug的文章,其中一种可能是我的更新过程只更新每个单元格的e
<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}" />