Привязать команду к MenuItem

У меня есть ListView, и я пытаюсь привязать команду к ContextMenu из ListView.

<ListView x:Name="listView1" ItemsSource="{Binding Path=Persons}">
            <ListView.Resources>
                <ContextMenu x:Key="ItemContextMenu">
                    <MenuItem Header="Add" />
                    <MenuItem Header="Edit"/>
                    <Separator/>
                    <MenuItem Header="Delete" Command="{Binding Msg}" /> 
                </ContextMenu>
            </ListView.Resources>
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <!--<EventSetter Event="PreviewMouseLeftButtonDown" />--><!--Handler="OnListViewItem_PreviewMouseLeftButtonDown" />-->
                    <Setter Property="ContextMenu" Value="{StaticResource ItemContextMenu}"/>
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Name}" />
                    <GridViewColumn Header="Sur Name" DisplayMemberBinding="{Binding Path=SurName}" />
                    <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Path=Age}" />
                </GridView>
            </ListView.View>


        </ListView>
        <Button Content="Message" Command="{Binding Msg}" />

Привязка к кнопке работает хорошо, но когда я нажимаю, чтобы удалить элемент в ContextMenu, команда не работает! Почему?


person Neir0    schedule 24.04.2010    source источник
comment
Возможно похожий вопрос: stackoverflow.com/questions/911904/. Решает ли этот ответ вашу проблему?   -  person Andy    schedule 25.04.2010


Ответы (1)


Ваша проблема связана с использованием привязок в ресурсах. Обычно они не работают, если вы не используете что-то вроде {Binding Path=Value,Source={x:Static Some.StaticProperty}}. Чтобы привязки ElementName или DataContext работали, вам нужно прибегнуть к помощи _ 4_ и DataContextSpy. В вашем конкретном случае, если вы полагаетесь на привязку DataContext, ваш XAML должен выглядеть так:

        <ListView.Resources>
            <DataContextSpy x:Name="spy" />
            <ContextMenu x:Key="ItemContextMenu">
                <MenuItem Header="Add" />
                <MenuItem Header="Edit"/>
                <Separator/>
                <MenuItem Header="Delete" Command="{Binding DataContext.Msg,Source={StaticResource spy}}" /> 
            </ContextMenu>
        </ListView.Resources>
person wpfwannabe    schedule 25.04.2010