MVVM-Light А как насчет событий? - PullRequest
1 голос
/ 16 октября 2010

Я начал использовать MVVM-Light с WPF вчера, и это действительно имеет значение, когда дело доходит до структурирования кода. Но сейчас я пытаюсь понять, как обрабатывать события.

Допустим, у меня есть это представление с TabControl. В каждом TabItem у меня есть ListBox. Теперь, как мне обработать событие SelectionChanged? И чтобы все испортить, могу ли я отправить ListBox с событием в качестве параметра?

Я очень благодарен за простой пример кода.

Ответы [ 2 ]

4 голосов
/ 18 октября 2010

В случае выбора измененных событий, лучше использовать встроенную поддержку WPF для этого: создайте ICollectionView, который обернет вашу коллекцию, свяжите его с ItemsControl (ListBox и т. Д.), И у ICollectionView будет автоматически синхронизирован CurrentItem. к текущему выбору. Конечно, это работает только для одного выбора.

Для более сложных событий, которые вы не можете обработать чисто MVVM-способом, всегда лучше использовать класс Messenger в MVVM Light для отправки сообщений и их перехвата слушателем; например, View может отправлять NotificationMessage, а ViewModel может зарегистрироваться в качестве получателя с Messenger.Register (я думаю, что это называется). Это очень расширяемый механизм - вы также можете отправить действие (Action<> или Func<> или любое другое) для выполнения другой стороной и т. Д. И т. Д.

Эти советы позволили мне без проблем работать с двумя крупномасштабными LOB-приложениями.

0 голосов
/ 07 октября 2011

Если вы хотите использовать более строгий подход к MVVM (или ненавидеть кодировать в выделенном коде), EventToCommand может быть другим вариантом.Он также входит в набор инструментов MVVM-light.

В представлении (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...
    }
}
...