2009-05-21 14 views
3

Я использую mvvm в приложении wpf. У меня есть ContextMenu внутри списка, и когда я нажимаю правой кнопкой мыши listviewitem, я хочу, чтобы контекстное меню отображало список контактов.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:

я понял это, я имел специальную коллекцию, которая вызвала связывание пути неверным.

Спасибо.

+0

Хотя у меня нет ответа для вас прямо сейчас, похоже, что вам не хватает –

+2

Хосе, я рад, что вы это поняли. Не могли бы вы разместить решение здесь, чтобы я (и другие) мог быть настолько просветленным :) –

ответ

2

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

+0

да, исправлено. –

1

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

Для меня помогла упаковка модели в класс 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; } 
} 

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