【问题标题】:Binding to a 2 dimensional array won't update after PropertyChangedPropertyChanged 后绑定到二维数组不会更新
【发布时间】:2013-09-17 10:52:34
【问题描述】:

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

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

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

当我第一次分配二维数组并设置绑定的 dataContext 时 - 它工作正常。

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

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

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

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

下面是我的绑定 Xaml:

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

这是源属性:

private Cell[][] GameBoard
{ get { return m_GameBoard;} }    

这是手动 PropertyChange 提升:

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

}

【问题讨论】:

  • 谁在“更新”,在哪里?你是raisePropertyChanged 个人Cells 吗?

标签: c# wpf binding multidimensional-array inotifypropertychanged


【解决方案1】:

我想回答我自己的问题:

我最基本的错误是使用了 INotifyPropertyChanged。 由于我使用的是对集合的绑定,因此我应该使用 INotifyCollectionChanged 接口。

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

【讨论】:

  • 只是关于使用INotifyCollectionChanged的说明,它仅在集合本身发生变化时触发,而不是在集合中对象的属性发生变化时触发。
  • 是的,你是对的。就我而言,UI 更改应该仅在我更新集合中多个项目的多个属性后发生,这就是我决定创建自己的自定义集合 ViewModel 的原因,正如我在回答中提到的那样。此 ViewModel 在自定义时间触发 CollectionChanged。再次感谢:)
【解决方案2】:

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

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

Array[0,1] = newValue;
NotifyPropertyChanged("Array"); // Your method may have a different name

试试这个,如果有帮助,请告诉我。

【讨论】:

  • 我已经从属性的设置器中手动引发了这个事件......请参阅问题的编辑。谢谢。
【解决方案3】:

来自ItemsControl.ItemsSource MSDN 文档:

Note that the ItemsSource property supports OneWay binding by default.

因此,您必须将Binding Mode 设置为Two-Way

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

【讨论】:

  • 按照我的理解,TwoWay 绑定模式允许 UI 更改到我的源集合中。这不是我想要达到的目标。如果您有兴趣,我已经发布了经过进一步研究后设法找到的解决方案。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 2011-07-29
  • 2019-10-25
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多