Получить DataContext от ListView Ancestor - PullRequest
1 голос
/ 12 мая 2009

Я разрабатываю приложение WPF с использованием MVVM и мне нужна помощь.

для просмотра моей модели AddressesViewModel У меня есть пользовательский контроль со списком. Я хотел бы выполнить команду, найденную в AddressesViewModel, из контекстного меню listViewItem. Поскольку я открываю ContextMenu, его нет в визуальном дереве (я это где-то читал).

Вот разметка просмотра:

    <UserControl>
        <ListView Name="lstAddress"
                        ItemsSource="{Binding Path=Addresses}" 
                        HorizontalAlignment="Stretch" MinHeight="150" MinWidth="100">
            <ListView.Resources>
                <ContextMenu x:Key="ItemContextMenu">
                    <MenuItem Header="Add Address"/>
                </ContextMenu>
            </ListView.Resources>
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Address" DisplayMemberBinding="{Binding Path=Address}/>
                    <GridViewColumn Header="City" DisplayMemberBinding="{Binding Path=City}"/>
                </GridView>
            </ListView.View>
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}">
                    <Setter Property="ContextMenu" Value="{StaticResource ItemContextMenu}"/>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
    </UserControl>

Вот классы ViewModel:

public class AddressesViewModel
{
    public List<AddressViewModel> Addresses { get; set; }

    public ICommand AddAddressCommand { get; set; }
}

public class AddressViewModel
{
    public String Address { get; set; }
    public String City { get; set; }
    public String State { get; set; }
    public String Zip { get; set; }
}

Заранее спасибо

1 Ответ

3 голосов
/ 25 июня 2009

Если ваш MenuItem выглядит следующим образом, он должен работать для вас:

                <MenuItem Header="Add Address" 
                          Command="{Binding DataContext.AddAddressCommand, 
                                RelativeSource={RelativeSource FindAncestor, 
                                    AncestorType={x:Type ListView}}}"/>
...