我的网格包含一个ItemsControl,它绑定到Cell的二维数组。
此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));
}
}
答案 0 :(得分:1)
我想回答我自己的问题:
我最基本的错误是使用了INotifyPropertyChanged。 由于我使用绑定到集合,我应该使用INotifyCollectionChanged接口。
为了解决我的问题,我为我的二维数组创建了一个ViewModel。这个ViewModel实现了ICollection和INotifyCollectionChanged接口,包装了我的二维数组,所以这个ViewModel能够正确地“插入”绑定。
答案 1 :(得分:0)
我在WPF中遇到过很多情况,有必要在属性设置器之外引发PropertyChanged
事件。我相信你的情况可能就是这种情况之一。更改实际单元格值不会影响数组属性,也不会引发PropertyChanged
事件。
在这些情况下,不仅可以完全接受,而且甚至有必要手动提升PropertyChanged
事件。我的意思是:
Array[0,1] = newValue;
NotifyPropertyChanged("Array"); // Your method may have a different name
试试这个并告诉我它是否有帮助。
答案 2 :(得分:0)
来自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}" />