私は 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 が含まれていることに注意してください。これも最初は正しくバインドされます)。
私の継承の実装についてはどうですか? 問題の原因を誤解している可能性はありますか?
編集: 以下のコメントのおかげで、 IsSelected が設定されている場合は常に PropertyChange イベントハンドラーが null になるように絞り込みました。わかりやすくするために、基本クラスで IsSelected のパブリック メンバーを定義する場所を次に示します。
[DataMember]
public bool IsSelected
{
get { return _IsSelected; }
set
{
if (_IsSelected != value)
{
_IsSelected = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("IsSelected"));
}
}
}
私のデモ アプリでは、すべてが機能し、上記のダミー ポイントの最初のセット (これは機能します) を使用すると、PropertyChanged は null ではなく、セッターは PropertyChanged イベントを発生させます。
ただし、DataPointSubclass を使用する場合、PropertyChanged は常に null です (ただし、setter はトリガーされています)。ここで何が欠けているのでしょうか?