我正在使用来自 Esri 的地图,它提供了一个功能,您可以将集合绑定到地图,它为绘制和渲染图形点提供了所有魔力。它只要求对象具有一些要绑定的属性,如下所示:
<esri:PointDataSource
ItemsSource="{Binding Path=PlottedData, Source={StaticResource ViewModel}, Mode=TwoWay}"
XCoordinateBinding="{Binding X}"
YCoordinateBinding="{Binding Y}"
IsSelectedBinding="{Binding IsSelected, Mode=TwoWay}">
当然,我的应用程序需要的数据不仅仅是这些点,而且还有不同的类型。这导致我们为所有不同类型创建 DataPoint 的子类,然后将它们传递给地图,这样地图就不会更明智了。
我在没有子类的演示应用程序中很好地工作,但是当我将它合并到应用程序中并开始从服务作为子类接收数据时,IsSelected 功能停止工作。我可以确认所有点上的 IsSelected 属性正在按预期切换,但是当我切换它们时,它们不会反射回地图上。澄清一下,如果我在它们返回模型后用这个替换服务结果:
var returned = new ObservableCollection<DataPoint>()
{
new DataPoint(){IsPlottable = true, IsSelected = false, X = 722762, Y = 488253},
new DataPoint(){IsSelected = false, X = 810000, Y = 550000, IsPlottable = true},
new DataPoint(){IsSelected = false, X = 801000, Y = 480000, IsPlottable = true},
new DataPoint(){IsSelected = false, X = 800100, Y = 500000, IsPlottable = true},
new DataPoint(){IsSelected = false, X = 800010, Y = 506000, IsPlottable = true}
};
然后它工作。然后当我用这个替换它时:
var returned = new ObservableCollection<DataPoint>()
{
new DataPointSubclass(){IsPlottable = true, IsSelected = false, X = 722762, Y = 488253},
new DataPointSubclass(){IsSelected = false, X = 810000, Y = 550000, IsPlottable = true},
new DataPointSubclass(){IsSelected = true, X = 801000, Y = 480000, IsPlottable = true},
new DataPointSubclass(){IsSelected = false, X = 800100, Y = 500000, IsPlottable = true},
new DataPointSubclass(){IsSelected = true, X = 800010, Y = 506000, IsPlottable = true}
};
它停止工作。同时,这些点被正确绘制了——所以我知道绑定至少在创建绑定集合时是有效的(注意上面的子类是如何有一些 IsSelected = true; 最初也是正确绑定的)。
我的继承实现可能会导致绑定从基本上从单向/双向绑定切换到一次性绑定?我可以错误地归因于这个问题吗?
编辑:感谢下面的评论,我将其范围缩小到 PropertyChange 事件处理程序在设置 IsSelected 时为空。为清楚起见,这里是我在基类中定义 IsSelected 的公共成员的地方:
[DataMember]
public bool IsSelected
{
get { return _IsSelected; }
set
{
if (_IsSelected != value)
{
_IsSelected = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("IsSelected"));
}
}
}
在我的演示应用程序中,一切正常,如果我使用上面的第一组虚拟点(有效),PropertyChanged 不为空,并且 setter 引发 PropertyChanged 事件。
但是,当使用 DataPointSubclass 时,PropertyChanged 始终为 null(但正在触发 setter)。我在这里能错过什么?