Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf MVVM Light事件呢?_Wpf_Mvvm Light_Selectionchanged - Fatal编程技术网

Wpf MVVM Light事件呢?

Wpf MVVM Light事件呢?,wpf,mvvm-light,selectionchanged,Wpf,Mvvm Light,Selectionchanged,我昨天开始在WPF中使用mvvmlight,它在构建代码时确实起到了作用。但现在我想知道如何处理这个事件 假设我有这个视图,带有一个TabControl。在每个选项卡项中,我都有一个列表框。现在我如何处理事件SelectionChanged? 为了把事情搞砸,我可以发送带有事件作为参数的列表框吗 我非常感谢一个简单的代码示例 在选择更改事件的情况下,最好使用WPF内置支持:创建一个ICollectionView包装您的集合,将其绑定到ItemsControl(ListBox等)上,ICollec

我昨天开始在WPF中使用mvvmlight,它在构建代码时确实起到了作用。但现在我想知道如何处理这个事件

假设我有这个视图,带有一个TabControl。在每个选项卡项中,我都有一个列表框。现在我如何处理事件SelectionChanged? 为了把事情搞砸,我可以发送带有事件作为参数的列表框吗


我非常感谢一个简单的代码示例

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

对于无法以MVVM方式干净处理的更复杂事件,最好使用MVVM Light中的Messenger类发送消息并让侦听器捕获它们;例如,视图可以发送NotificationMessage,ViewModel可以注册为Messenger.register的收件人(我想它被称为)。这是一个非常可扩展的机制-您还可以发送一个操作(
action
Func
或其他任何内容),由另一方执行,等等


这些技巧让我顺利地完成了两个中等规模的LOB应用程序。

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

对于无法以MVVM方式干净处理的更复杂事件,最好使用MVVM Light中的Messenger类发送消息并让侦听器捕获它们;例如,视图可以发送NotificationMessage,ViewModel可以注册为Messenger.register的收件人(我想它被称为)。这是一个非常可扩展的机制-您还可以发送一个操作(
action
Func
或其他任何内容),由另一方执行,等等


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

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

在视图(XAML)中,listbox中的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>
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...
    }
}

在ViewModel中,RelayCommand和一个方法接收数据,如下所示

<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>
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...
    }
}
public图标命令并选择controltype
{
获取{return\u selectControlType??(\u selectControlType=new RelayCommand(DoSomething));}
}
//后场。
专用中继命令\u选择控制类型;
//方法来处理SelectionChanged事件中的数据
公共void DoSomething(对象参数)
{
if(参数为ValidItemType)
{
//做点什么。。。
}
}

如果您想更严格地使用MVVM方法(或者讨厌在代码隐藏中编码),EventToCommand可以是另一个选项。 它也在MVVM light工具包中

在视图(XAML)中,listbox中的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>
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...
    }
}

在ViewModel中,RelayCommand和一个方法接收数据,如下所示

<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>
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...
    }
}
public图标命令并选择controltype
{
获取{return\u selectControlType??(\u selectControlType=new RelayCommand(DoSomething));}
}
//后场。
专用中继命令\u选择控制类型;
//方法来处理SelectionChanged事件中的数据
公共void DoSomething(对象参数)
{
if(参数为ValidItemType)
{
//做点什么。。。
}
}