新しい WinRT アプリで、オブジェクトのコレクションの ID プロパティを管理する必要がある状況があります。基本的に、新しいオブジェクトが追加されるたびにインクリメントする必要があるオブジェクトごとに一意の ID を保持しています。これは、データを保存するために XML にシリアル化するため、この ID を自分で管理する必要があるためです。SQL を使用していた場合、自動インクリメント フィールドになります。
私が思いついた最善の方法は、コンストラクターから呼び出されたメソッドを使用してこれを設定し、コレクション変更ハンドラーを使用して毎回値を更新することでした。
ビューモデルクラスは次のとおりです。
using MM.Models;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
namespace MM.ViewModels
{
public class VehiclesViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
public VehiclesViewModel()
{
Vehicles = new ObservableCollection<Vehicle>();
NewVehicle = new Vehicle();
NextVehicleID = CalculateHighestID(Vehicles.AsQueryable()) + 1;
Vehicles.CollectionChanged += new NotifyCollectionChangedEventHandler(VehicleCollectionChanged);
}
private ObservableCollection<Vehicle> _vehicles;
public ObservableCollection<Vehicle> Vehicles
{
get
{
return _vehicles;
}
set
{
if (_vehicles != value)
{
_vehicles = value;
PropertyChanged(this, new PropertyChangedEventArgs("Vehicles"));
}
}
}
void VehicleCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
NextVehicleID += 1;
}
}
public Vehicle NewVehicle { get; set; }
private int _nextVehicleID;
public int NextVehicleID
{
get
{
return _nextVehicleID;
}
private set
{
_nextVehicleID = value;
PropertyChanged(this, new PropertyChangedEventArgs("NextVehicleID"));
}
}
private int CalculateHighestID(IQueryable<Vehicle> vehicles)
{
var query = vehicles.OrderByDescending(v => v.VehicleID).FirstOrDefault();
if (query != null)
{
return query.VehicleID;
}
else
{
return 1;
}
}
}
}
これは、アイテムを追加するために xaml ページに追加したテキスト ボタン クリック メソッドです。
private void Button_Click_1(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
vm.Vehicles.Add(new Vehicle { VehicleID = vm.NextVehicleID });
}
ただし、VehicleCollectionChanged が呼び出されることはありません。テストとして、同じコードを使用してコンストラクター メソッドから車両を追加したところ、うまくいきました。
xamlボタンのクリックから車両を追加してもメソッドが呼び出されない理由を誰でも説明できますか?
また、次のレコードの ID 値を追跡するためのより良い全体的なアプローチはありますか?