1

昨日、WPF で MVVM-Light を使い始めましたが、コードの構造化に関しては本当に違いがあります。しかし今、私はイベントを処理する方法を理解しようとしています。

TabControl を使用して、このビューを取得したとしましょう。すべての TabItem に ListBox があります。イベントSelectionChangedをどのように処理しますか? そして、物事を台無しにするために、イベントをパラメーターとして ListBox を送信できますか?

シンプルなコードサンプルにとても感謝しています。

4

2 に答える 2

4

選択が変更されたイベントの場合は、そのためのWPF組み込みサポートを使用することをお勧めします。コレクションをラップするICollectionViewを作成し、ItemsControl(ListBoxなど)にバインドすると、ICollectionViewのCurrentItemが現在の選択。もちろん、これは単一の選択に対してのみ機能します。

MVVMの方法できれいに処理できないより複雑なイベントの場合は、MVVM LightのMessengerクラスを使用してメッセージを送信し、リスナーにキャッチさせることをお勧めします。たとえば、ViewはNotificationMessageを送信でき、ViewModelは受信者として登録できますMessenger.Register(私はそれが呼び出されていると思います)。これは非常に拡張可能なメカニズムです。反対側などで実行されるアクション(Action<>またはその他)を送信することもできます。Func<>

これらのヒントにより、2つの中規模のLOBアプリケーションを問題なく実行できました。

于 2010-10-17T22:58:28.547 に答える
1

MVVMアプローチをより厳密に実行したい場合(またはコードビハインドでコーディングするのが嫌いな場合)、EventToCommandを別のオプションにすることができます。MVVM-lightツールキットにも含まれています。

View(XAML)では、リストボックス内のSelectedItemが次のようにViewModelに提供されます。

<ListBox Name="controlType" ItemsSource={Binding Path=items}>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <cmd:EventToCommand Command="{Binding Path=SelectControlType, Mode=OneWay}" CommandParameter="{Binding Path=SelectedItem, ElementName=controlType}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ListBox>

ViewModelでは、RelayCommandとメソッドは以下のようにデータを受け取ります。

public ICommand SelectControlType
{
    get { return _selectControlType ?? (_selectControlType = new RelayCommand<object>(DoSomething)); }
}

// backing field.
private RelayCommand<object> _selectControlType; 

// method to handle the data from SelectionChanged event    
public void DoSomething(object param)
{
    if(param is ValidItemType)
    {
        // Do somthing...
    }
}
于 2011-10-07T13:25:55.600 に答える