2

起動するようにイベントに接続されたコマンドがありますが、CommandParameterで取得するのは、以前に選択されたアイテムであるか、SelectionChangedが完了する前に選択されたアイテムである可能性があります。

いずれにせよ、イベントから新しく選択されたアイテムを取得するために何を変更すればよいかわからない。

<i:Interaction.Triggers>
  <i:EventTrigger EventName="SelectionChanged">
    <cmd:EventToCommand 
    Command="{Binding Main.SelectedRecordCommand, Source={StaticResource Locator}}" 
    CommandParameter="{Binding SelectedItem, ElementName=listBillingRecords}" 
    />
   </i:EventTrigger>
</i:Interaction.Triggers>

ありがとう

4

2 に答える 2

1

トリガーを使用する価値はありますか?コレクション用の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
    }

お役に立てれば...

于 2011-04-01T03:51:41.667 に答える
0

同じ問題を確認し、SelectedItemが正しい実装であることがわかりました。

于 2012-07-11T18:47:35.363 に答える