首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVVM-Light事件怎么办?

MVVM-Light事件怎么办?
EN

Stack Overflow用户
提问于 2010-10-16 19:54:23
回答 2查看 2.8K关注 0票数 1

我昨天开始在WPF中使用MVVM-Light,当涉及到构建代码时,这真的很重要。但现在我正在尝试弄清楚如何处理事件。

假设我有一个带有TabControl的视图。在每个TabItem中,我都有一个ListBox。现在我该如何处理事件SelectionChanged呢?更糟糕的是,我可以将事件作为参数发送ListBox吗?

我非常感谢你提供了一个简单的代码示例。

EN

回答 2

Stack Overflow用户

发布于 2010-10-18 06:58:29

在选择更改事件的情况下,最好使用WPF内置支持:创建包装集合的ICollectionView,将其绑定到ItemsControl (ListBox等)。并且ICollectionView将使其CurrentItem自动同步到当前选择。当然,这只适用于单项选择。

对于不能以MVVM方式干净地处理的更复杂的事件,使用MVVM Light中的Messenger类发送消息并让侦听器捕获它们总是更好;例如,视图可以发送NotificationMessage,而ViewModel可以向Messenger.Register注册为接收者(我认为它是被调用的)。这是一种非常可扩展的机制--你还可以发送一个动作(Action<>Func<>或其他任何东西),让对方执行,等等。

这些技巧让我顺利地通过了两个中型LOB应用程序。

票数 4
EN

Stack Overflow用户

发布于 2011-10-07 21:25:56

如果您希望更严格地使用MVVM方法(或者不喜欢在代码隐藏中编写代码),EventToCommand可以是另一种选择。它也在MVVM-light工具包中。

在视图(XAML)中,列表框中的SelectedItem被提供给ViewModel,如下所示。

代码语言:javascript
复制
<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和方法接收数据,如下所示。

代码语言:javascript
复制
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...
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3948780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档