WPF ContextMenu - PullRequest
       20

WPF ContextMenu

3 голосов
/ 21 мая 2009

Я использую mvvm в приложении wpf. У меня есть ContextMenu внутри списка, и когда я щелкаю правой кнопкой мыши по элементу списка, я хочу, чтобы контекстное меню отображало список контактов.

Следующее просто дает мне контекстное меню без содержания. Может кто-нибудь сказать мне, что я делаю не так?

<ListView Grid.Row="3"
            ItemsSource="{Binding Path=Phones}"
            SelectedItem="{Binding Phones.SelectedItem}"
            Height="100">
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="ContextMenu" Value="{StaticResource ContactMenu}"/>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Phone" DisplayMemberBinding="{Binding Path=PhoneNumber, StringFormat=(000) 000-0000}"/>
            <GridViewColumn Header="Type" DisplayMemberBinding="{Binding Path=PhoneType.Type}"/>
            <GridViewColumn Header="Contacts" DisplayMemberBinding="{Binding Path=Contacts.Count}"/>
            <GridViewColumn Header="Notes" DisplayMemberBinding="{Binding Path= Notes.Count}"/>
            <GridViewColumn Header="Priority" DisplayMemberBinding="{Binding Path=Priority}"/>
        </GridView>
    </ListView.View>
</ListView>


<UserControl.Resources>
    <Style TargetType="{x:Type ListViewItem}">
        <Setter Property="Background" Value="{Binding SourceType, Converter={StaticResource SourceGroupConverter}}"/>
    </Style>
    <ContextMenu x:Key="ContactMenu" ItemsSource="{Binding Contacts}" >
        <ContextMenu.ItemTemplate>
            <DataTemplate>
                <MenuItem Header="{Binding Path=FirstName}"/>
            </DataTemplate>
    </ContextMenu>
</UserControl.Resources>

UPDATE:

Я понял, у меня была специальная коллекция, из-за которой путь привязки был неверным.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 22 мая 2009

Контекстное меню не существует в визуальном дереве вашей страницы, поэтому оно не наследует контекст данных. Попробуйте установить DataContext непосредственно в ContextMenu.

1 голос
/ 15 марта 2010

Мне не хватало ответа Хосе о том, как он обошел проблему, но смог понять это сам.

Для меня помогла обернуть модель в класс viewmodel с помощью аксессоров.

Например:

ObservableCollection<CtxItemViewModel> ctxItems = new ObservableCollection<CtxItemViewModel>();
CtxItem c = new CtxItem();
c.Name = "Hello World";
ctxItems.Add(new CtxItemViewModel(c));

и внутри ViewModel:

public string Name {
   get { return _model.Name; }
   set { _model.Name = value; }
}

Добавление аксессоров помогло мне с привязкой. Надеюсь, это поможет и другим.

...