0

我的网格包含一个绑定到二维单元格数组的 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));
    }

}
4

3 回答 3

1

我想回答我自己的问题:

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

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

于 2013-09-24T13:26:29.060 回答
0

ItemsControl.ItemsSource MSDN 文档:

Note that the ItemsSource property supports OneWay binding by default.

因此,您必须将 设置Binding ModeTwo-Way

<ItemsControl Name="Board" ItemTemplate="{DynamicResource DataTemplate_Level1}" 
ItemsSource="{Binding 
Path=GameBoard, Mode=Two-Way,
UpdateSourceTrigger=PropertyChanged,
diag:PresentationTraceSources.TraceLevel=High}" /> 
于 2013-09-17T13:47:10.093 回答
0

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

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

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

试试这个,让我知道它是否有帮助。

于 2013-09-17T11:12:27.143 回答