トリガーを使用する価値はありますか?コレクション用のXAML要素(リストボックス、グリッドなど)がビューモデル上のコレクションを公開するプロパティにバインドされている場合は、データバインディングと組み込みのMVVM Lightメッセンジャーの両方を利用して、両方のプロパティの変更を通知できます。よりMVVMに適した方法での新旧の値。この例は必ずしもWP7固有ではありませんが、同じように機能すると思います。
たとえば、これはデータバインドされたコレクションである可能性があります。
public const string BillingRecordResultsPropertyName = "BillingRecordResults";
private ObservableCollection<BillingRecord> _billingRecordResults = null;
public ObservableCollection<BillingRecord> BillingRecordResults
{
get
{
return _billingRecordResults;
}
set
{
if (_billingRecordResults == value)
{
return;
}
var oldValue = _billingRecordResults;
_billingRecordResults = value;
// Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
RaisePropertyChanged(BillingRecordResultsPropertyName, oldValue, value, true);
}
}
公開しているコレクションの「選択されたアイテム」であるViewModelのプロパティを公開するのが好きです。したがって、ViewModelに、MVVMINPCスニペットを使用してこのプロパティを追加します。
public const string SelectedBillingRecordPropertyName = "SelectedBillingRecord";
private BillingRecord _selectedBillingRecord = null;
public BillingRecord SelectedBillingRecord
{
get
{
return _selectedBillingRecord;
}
set
{
if (_selectedBillingRecord == value)
{
return;
}
var oldValue = _selectedBillingRecord;
_selectedBillingRecord = value;
// Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
RaisePropertyChanged(SelectedBillingRecordPropertyName, oldValue, value, true);
}
}
これで、XAML要素のSelectedItemをこの公開されたプロパティにバインドすると、データバインディングを介してビューで選択されたときにデータが入力されます。
しかし、さらに良いことに、スニペットMVVMINPCを活用すると、結果を聞いている人にブロードキャストするかどうかを選択できます。この場合、SelectedBillingRecordプロパティがいつ変更されるかを知りたいと思います。したがって、ViewModelのコンストラクターにこれを含めることができます。
Messenger.Default.Register<PropertyChangedMessage<BillingRecord>>(this, br => SelectedRecordChanged(br.NewValue));
そして、ViewModelの他の場所で、実行したいアクションは次のとおりです。
private void SelectedRecordChanged(BillingRecord br)
{
//Take some action here
}
お役に立てれば...