将事件添加到DataTemplate中的项目

时间:2014-12-11 12:49:09

标签: c# xaml events mvvm

在我的带有DataTemplates的xaml文件中,我想将DataContextChanged事件添加到其中一个模板中的ListBox,所以我这样做:

<DataTemplate x:Key="MyTemplate">
    <ListBox Background="Transparent"
             DataContext="{Binding Source={StaticResource Locator}}"
             DataContextChanged="MyListBox_DataContextChanged"
             SelectedItem="{Binding MyViewModel.SelSegment, Mode=TwoWay}"/>
</DataTemplate>

但是在哪个文件中实现“MyListBox_DataContextChanged”?

1 个答案:

答案 0 :(得分:1)

在使用Mvvm时,你不会像处理代码时那样直接处理事件,在你的情况下,处理DataContextChanged的命令应该在页面的相应ViewModel中实现使用DataTemplate, 最后使用简单的hack,你可以在DataContextChanged事件得到执行时执行相关的命令,你的代码应如下所示: Xaml:

<DataTemplate x:Key="MyTemplate">
            <ListBox Background="Transparent"
             DataContext="{Binding Source={StaticResource Locator}}"          
             SelectedItem="{Binding MyViewModel.SelSegment, Mode=TwoWay}">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="DataContextChanged">
                        <command:EventToCommand Command="{Binding Mode=OneWay,Path=MyViewModel.MyListBox_DataContextChangedCommand}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </ListBox>
        </DataTemplate>

并将以下命令添加到ViewModel:

 private RelayCommand __myListBox_DataContextChangedCommand;
        public RelayCommand MyListBox_DataContextChangedCommand
        {
            get
            {
                return __myListBox_DataContextChangedCommand
                    ?? (__myListBox_DataContextChangedCommand = new RelayCommand(
                    () =>
                    {
                        //Your Event's Handler Goes Here
                    }));
            }
        }

修改

您可以阅读有关EventToCommand的更多信息 Commands, RelayCommands and EventToCommand