WPF如何将附加事件绑定到viewmodel?

时间:2017-03-24 06:39:49

标签: wpf mvvm data-binding

<TreeView x:Name="TestTree"  
                  ItemsSource="{Binding Children}"
                  ItemTemplateSelector="{StaticResource TemplateSelector}" >
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="TreeViewItem.Seleted">
            <i:InvokeCommandAction 
                        Command="{Binding SelectedCommand}"
                        CommandParameter="{Binding RelativeSource={RelativeSource Self}}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TreeView>

如上所述,我想从视图中获取所选的treeviewitem数据,而在viewmodel中无法接收作为附加事件(成员事件正常)的绑定事件TreeViewItem.Seleted。如何将附加事件绑定到viewmodel?

2 个答案:

答案 0 :(得分:0)

然后,你在TreeView中没有获得TreeViewItem事件?你需要一个自定义项目模板。我在MVVMLight(但没有项目)

的数据网格上这样做
</DataGrid.Columns>
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="MouseDoubleClick" >
                            <command:EventToCommand Command="{Binding Path=OpenEquipementCommand}" PassEventArgsToCommand="True"/>
                        </i:EventTrigger>

                        <i:EventTrigger EventName="SelectionChanged">
                            <command:EventToCommand Command="{Binding Path=SelectionChangedCommand}" PassEventArgsToCommand="True" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>

                </DataGrid>

所以我认为你必须这样做

<i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectedItemChanged" >
                <command:EventToCommand Command="{Binding Path=SelectionChangedCommand}" PassEventArgsToCommand="True" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

答案 1 :(得分:0)

为什么不使用普通的旧事件处理程序?

<TreeView x:Name="TreeView1" SelectedItemChanged="TreeView_SelectedItemChanged" />
public partial class MainWindow : Window
{
    MainWindowViewModel ViewModel => (MainWindowViewModel) DataContext;

    private void TreeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        var element = (FrameworkElement)sender;
        var item = element.DataContext;
        ViewModel.SelectionChangedCommand.Invoke(item);

        //alternativelly:
        ViewModel.SelectedItem = TreeView1.SelectedItem;
    }
}

仅仅因为WPF支持绑定,它并不意味着你必须在任何地方使用它,即使它非常复杂。我写的代码并没有违反MVVM。

如果您有充分的理由避免代码落后,您可以在作为附加属性实现的自定义行为中实现此事件处理程序,因此它看起来像这样:

<TreeView local:TreeViewBehavior.SelectionChangedCommand="{Binding SelectionChangedCommand}" />